File indexing completed on 2024-04-28 04:21:32

0001 /*
0002  *  SPDX-FileCopyrightText: 2010 Lukáš Tvrdý lukast.dev @gmail.com
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "kis_random_iterator_benchmark.h"
0008 #include "kis_benchmark_values.h"
0009 
0010 #include "kis_paint_device.h"
0011 
0012 #include <KoColorSpace.h>
0013 #include <KoColorSpaceRegistry.h>
0014 #include <KoColor.h>
0015 
0016 #include <simpletest.h>
0017 #include <kis_random_accessor_ng.h>
0018 
0019 
0020 void KisRandomIteratorBenchmark::initTestCase()
0021 {
0022     m_colorSpace = KoColorSpaceRegistry::instance()->rgb8();
0023     m_device = new KisPaintDevice(m_colorSpace);
0024     m_color = new KoColor(m_colorSpace);
0025     // some random color
0026     m_color->fromQColor(QColor(0,120,250));
0027     m_device->fill(0,0,TEST_IMAGE_WIDTH,TEST_IMAGE_HEIGHT,m_color->data());
0028 }
0029 
0030 void KisRandomIteratorBenchmark::cleanupTestCase()
0031 {
0032     delete m_color;
0033     delete m_device;
0034 }
0035 
0036 
0037 void KisRandomIteratorBenchmark::benchmarkCreation()
0038 {
0039     QBENCHMARK{
0040         KisRandomAccessorSP it = m_device->createRandomAccessorNG();
0041     }
0042 }
0043 
0044 void KisRandomIteratorBenchmark::benchmarkWriteBytes()
0045 {
0046     KisRandomAccessorSP it = m_device->createRandomAccessorNG();
0047     
0048     QBENCHMARK{
0049         for (int i = 0; i < TEST_IMAGE_HEIGHT; i++){
0050             for (int j = 0; j < TEST_IMAGE_WIDTH; j++) {
0051                 it->moveTo(j,i);
0052                 memcpy(it->rawData(), m_color->data(), m_colorSpace->pixelSize());
0053             }
0054         }
0055     }
0056 }
0057     
0058 
0059 void KisRandomIteratorBenchmark::benchmarkReadBytes()
0060 {
0061     KisRandomAccessorSP it = m_device->createRandomAccessorNG();
0062 
0063     QBENCHMARK{
0064         for (int i = 0; i < TEST_IMAGE_HEIGHT; i++){
0065             for (int j = 0; j < TEST_IMAGE_WIDTH; j++) {
0066                 it->moveTo(j,i);
0067                 memcpy(m_color->data(), it->rawData(), m_colorSpace->pixelSize());
0068             }
0069         }
0070     }
0071 }
0072 
0073 
0074 void KisRandomIteratorBenchmark::benchmarkConstReadBytes()
0075 {
0076     KisRandomConstAccessorSP it = m_device->createRandomConstAccessorNG();
0077 
0078     QBENCHMARK{
0079         for (int i = 0; i < TEST_IMAGE_HEIGHT; i++){
0080             for (int j = 0; j < TEST_IMAGE_WIDTH; j++) {
0081                 it->moveTo(j,i);
0082                 memcpy(m_color->data(), it->oldRawData(), m_colorSpace->pixelSize());
0083             }
0084         }
0085     }
0086 }
0087 
0088 void KisRandomIteratorBenchmark::benchmarkReadWriteBytes(){
0089     KoColor c(m_colorSpace);
0090     c.fromQColor(QColor(250,120,0));
0091     KisPaintDevice dab(m_colorSpace);
0092     dab.fill(0,0,TEST_IMAGE_WIDTH,TEST_IMAGE_HEIGHT, c.data());
0093     
0094     KisRandomAccessorSP writeIterator = m_device->createRandomAccessorNG();
0095     KisRandomConstAccessorSP constReadIterator = dab.createRandomConstAccessorNG();
0096 
0097     QBENCHMARK{
0098         for (int i = 0; i < TEST_IMAGE_HEIGHT; i++){
0099             for (int j = 0; j < TEST_IMAGE_WIDTH; j++) {
0100                 writeIterator->moveTo(j,i);
0101                 constReadIterator->moveTo(j,i);
0102                 memcpy(writeIterator->rawData(), constReadIterator->oldRawData(), m_colorSpace->pixelSize());
0103             }
0104         }
0105     }
0106     
0107 }
0108 
0109 
0110 void KisRandomIteratorBenchmark::benchmarkTotalRandom()
0111 {
0112     KisRandomAccessorSP it = m_device->createRandomAccessorNG();
0113     // set the seed so that we always go in the same permutation over the device
0114     srand(123456);
0115    
0116     QBENCHMARK{
0117         for (int i = 0; i < TEST_IMAGE_HEIGHT; i++){
0118             for (int j = 0; j < TEST_IMAGE_WIDTH; j++) {
0119                 it->moveTo( rand() % TEST_IMAGE_WIDTH, 
0120                            rand() % TEST_IMAGE_HEIGHT );
0121                 memcpy(it->rawData(), m_color->data(), m_colorSpace->pixelSize());
0122             }
0123         }
0124     }
0125 }
0126 
0127 void KisRandomIteratorBenchmark::benchmarkTotalRandomConst()
0128 {
0129     KisRandomConstAccessorSP it = m_device->createRandomConstAccessorNG();
0130     // set the seed so that we always go in the same permutation over the device
0131     srand(123456);
0132    
0133     QBENCHMARK{
0134         for (int i = 0; i < TEST_IMAGE_HEIGHT; i++){
0135             for (int j = 0; j < TEST_IMAGE_WIDTH; j++) {
0136                 it->moveTo( rand() % TEST_IMAGE_WIDTH, 
0137                            rand() % TEST_IMAGE_HEIGHT );
0138                 memcpy(m_color->data(), it->oldRawData(), m_colorSpace->pixelSize());
0139             }
0140         }
0141     }
0142 }
0143 
0144 
0145 
0146 void KisRandomIteratorBenchmark::benchmarkNoMemCpy()
0147 {
0148     KisRandomAccessorSP it = m_device->createRandomAccessorNG();
0149     
0150     QBENCHMARK{
0151         for (int i = 0; i < TEST_IMAGE_HEIGHT; i++){
0152             for (int j = 0; j < TEST_IMAGE_WIDTH; j++) {
0153                 it->moveTo(j,i);
0154             }
0155         }
0156     }
0157 }
0158     
0159 
0160 void KisRandomIteratorBenchmark::benchmarkConstNoMemCpy()
0161 {
0162     KisRandomConstAccessorSP it = m_device->createRandomConstAccessorNG();
0163 
0164     QBENCHMARK{
0165         for (int i = 0; i < TEST_IMAGE_HEIGHT; i++){
0166             for (int j = 0; j < TEST_IMAGE_WIDTH; j++) {
0167                 it->moveTo(j,i);
0168             }
0169         }
0170     }
0171 }
0172 
0173 #define TEST_AREA_WIDTH 256
0174 #define TEST_AREA_HEIGHT 64
0175 void KisRandomIteratorBenchmark::benchmarkTileByTileWrite()
0176 {
0177     int xTiles = TEST_IMAGE_WIDTH / TEST_AREA_WIDTH;
0178     int yTiles = TEST_IMAGE_HEIGHT / TEST_AREA_HEIGHT;
0179     
0180     int xUnprocessed = int(TEST_IMAGE_WIDTH) % int(TEST_AREA_WIDTH);
0181     int yUnprocessed = int(TEST_IMAGE_HEIGHT) % int(TEST_AREA_HEIGHT);
0182     if ((xUnprocessed) != 0 || (yUnprocessed) != 0)
0183     {
0184         dbgKrita << "There will be some unprocessed pixels! Test area differs from the image size";
0185     }
0186     
0187     KisRandomAccessorSP it = m_device->createRandomAccessorNG();
0188     QBENCHMARK{
0189         for (int yTile = 0; yTile < yTiles; yTile++){
0190             for (int xTile = 0; xTile < xTiles; xTile++){
0191                 int x = xTile * TEST_AREA_WIDTH;
0192                 int y = yTile * TEST_AREA_HEIGHT;
0193                 for (int j = y; j< y+TEST_AREA_HEIGHT; j++ ){
0194                     for (int i = x; i < x+TEST_AREA_WIDTH ; i++){
0195                         it->moveTo(i,j);
0196                         memcpy(it->rawData(), m_color->data(), m_colorSpace->pixelSize());
0197                     }
0198                 }
0199             }
0200         }
0201     }
0202 }
0203 
0204 
0205 void KisRandomIteratorBenchmark::benchmarkTwoIteratorsNoMemCpy()
0206 {
0207     KoColor c(m_colorSpace);
0208     c.fromQColor(QColor(250,120,0));
0209     KisPaintDevice dab(m_colorSpace);
0210     dab.fill(0,0,TEST_IMAGE_WIDTH,TEST_IMAGE_HEIGHT, c.data());
0211     
0212     KisRandomAccessorSP writeIterator = m_device->createRandomAccessorNG();
0213     KisRandomConstAccessorSP constReadIterator = dab.createRandomConstAccessorNG();
0214 
0215     QBENCHMARK{
0216         for (int i = 0; i < TEST_IMAGE_HEIGHT; i++){
0217             for (int j = 0; j < TEST_IMAGE_WIDTH; j++) {
0218                 writeIterator->moveTo(j,i);
0219                 constReadIterator->moveTo(j,i);
0220             }
0221         }
0222     }
0223 }
0224 
0225 
0226 SIMPLE_TEST_MAIN(KisRandomIteratorBenchmark)