[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