[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: =?utf-8?q?=5Bcalligra/krita-bounded-pooler-kazakov=5D_krita/imag?=
From: Dmitry Kazakov <dimula73 () gmail ! com>
Date: 2011-03-06 19:18:40
Message-ID: 20110306191840.B4FF8A60C6 () git ! kde ! org
[Download RAW message or body]
Git commit c3177f1749e159c0d604733df9e485dedf84c194 by Dmitry Kazakov.
Committed on 05/03/2011 at 17:35.
Pushed by dkazakov into branch 'krita-bounded-pooler-kazakov'.
Added a benchmark for COW to measure the pooler help
The results of the benchmark:
We measure a write access to every tile of an RGB16 image of size
4096x2048 pixels. This rewrite demands COW for every tile.
The measured time is:
o with pooler enabled: 12ms
o with pooler disabled: 94ms
Conclusion:
the pooler is worth spending time on it ;)
M +3 -1 krita/image/tiles3/kis_tile_data_pooler.cc
M +10 -0 krita/image/tiles3/kis_tile_data_store.cc
M +4 -0 krita/image/tiles3/kis_tile_data_store.h
M +57 -0 krita/image/tiles3/tests/kis_tiled_data_manager_test.cpp
M +5 -0 krita/image/tiles3/tests/kis_tiled_data_manager_test.h
http://commits.kde.org/calligra/c3177f1749e159c0d604733df9e485dedf84c194
diff --git a/krita/image/tiles3/kis_tile_data_pooler.cc \
b/krita/image/tiles3/kis_tile_data_pooler.cc index e9fd81c..dd0aaf5 100644
--- a/krita/image/tiles3/kis_tile_data_pooler.cc
+++ b/krita/image/tiles3/kis_tile_data_pooler.cc
@@ -150,13 +150,15 @@ inline bool KisTileDataPooler::interestingTileData(KisTileData* \
td)
void KisTileDataPooler::run()
{
+ m_shouldExitFlag = false;
+
while (1) {
DEBUG_SIMPLE_ACTION("went to bed... Zzz...");
waitForWork();
if (m_shouldExitFlag)
- return;
+ break;
QThread::msleep(0);
DEBUG_SIMPLE_ACTION("cycle started");
diff --git a/krita/image/tiles3/kis_tile_data_store.cc \
b/krita/image/tiles3/kis_tile_data_store.cc index 88b9d11..20c1dde 100644
--- a/krita/image/tiles3/kis_tile_data_store.cc
+++ b/krita/image/tiles3/kis_tile_data_store.cc
@@ -283,3 +283,13 @@ void KisTileDataStore::debugClear()
iter = m_tileDataList.erase(iter);
}
}
+
+void KisTileDataStore::testingSuspendPooler()
+{
+ m_pooler.terminatePooler();
+}
+
+void KisTileDataStore::testingResumePooler()
+{
+ m_pooler.start();
+}
diff --git a/krita/image/tiles3/kis_tile_data_store.h \
b/krita/image/tiles3/kis_tile_data_store.h index 53daa88..470abe4 100644
--- a/krita/image/tiles3/kis_tile_data_store.h
+++ b/krita/image/tiles3/kis_tile_data_store.h
@@ -133,6 +133,10 @@ private:
void debugSwapAll();
void debugClear();
+
+ friend class KisTiledDataManagerTest;
+ void testingSuspendPooler();
+ void testingResumePooler();
private:
KisTileDataPooler m_pooler;
KisTileDataSwapper m_swapper;
diff --git a/krita/image/tiles3/tests/kis_tiled_data_manager_test.cpp \
b/krita/image/tiles3/tests/kis_tiled_data_manager_test.cpp index 2b59873..30dd39d \
100644
--- a/krita/image/tiles3/tests/kis_tiled_data_manager_test.cpp
+++ b/krita/image/tiles3/tests/kis_tiled_data_manager_test.cpp
@@ -378,7 +378,64 @@ void KisTiledDataManagerTest::benchmarkSharedPointers()
//CALLGRIND_STOP_INSTRUMENTATION;
}
+void KisTiledDataManagerTest::benchmarkCOWImpl()
+{
+ const int pixelSize = 8;
+ quint8 defaultPixel[pixelSize];
+ memset(defaultPixel, 1, pixelSize);
+
+ KisTiledDataManager dm(pixelSize, defaultPixel);
+
+
+ KisMementoSP memento1 = dm.getMemento();
+
+ /**
+ * Imagine a regular image of 4096x2048 pixels
+ * (64x32 tiles)
+ */
+ for (int i = 0; i < 32; i++) {
+ for (int j = 0; j < 64; j++) {
+ KisTileSP tile = dm.getTile(j, i, true);
+ tile->lockForWrite();
+ tile->unlock();
+ }
+ }
+
+ dm.commit();
+
+ QTest::qSleep(500);
+
+ KisMementoSP memento2 = dm.getMemento();
+ QTest::qSleep(500);
+ QBENCHMARK {
+
+ for (int i = 0; i < 32; i++) {
+ for (int j = 0; j < 64; j++) {
+ KisTileSP tile = dm.getTile(j, i, true);
+ tile->lockForWrite();
+ tile->unlock();
+ }
+ }
+
+ }
+ dm.commit();
+}
+void KisTiledDataManagerTest::benchmarkCOWNoPooler()
+{
+ KisTileDataStore::instance()->testingSuspendPooler();
+ QTest::qSleep(500);
+
+ benchmarkCOWImpl();
+
+ KisTileDataStore::instance()->testingResumePooler();
+ QTest::qSleep(500);
+}
+
+void KisTiledDataManagerTest::benchmarkCOWWithPooler()
+{
+ benchmarkCOWImpl();
+}
/******************* Stress job ***********************/
diff --git a/krita/image/tiles3/tests/kis_tiled_data_manager_test.h \
b/krita/image/tiles3/tests/kis_tiled_data_manager_test.h index 87b9fa1..1a493ad \
100644
--- a/krita/image/tiles3/tests/kis_tiled_data_manager_test.h
+++ b/krita/image/tiles3/tests/kis_tiled_data_manager_test.h
@@ -40,6 +40,8 @@ private:
bool takeOldSrc, bool takeOldDst,
QRect tilesRect);
+ void benchmarkCOWImpl();
+
private slots:
void testUnversionedBitBlt();
void testVersionedBitBlt();
@@ -49,6 +51,9 @@ private slots:
void benchmarkReadOnlyTileLazy();
void benchmarkSharedPointers();
+ void benchmarkCOWNoPooler();
+ void benchmarkCOWWithPooler();
+
void stressTest();
};
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic