File indexing completed on 2025-02-16 04:05:07
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)