File indexing completed on 2025-02-09 05:01:42
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_hline_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 0018 #include "kis_iterator_ng.h" 0019 0020 void KisHLineIteratorBenchmark::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,0,250)); 0027 m_device->fill(0,0,TEST_IMAGE_WIDTH,TEST_IMAGE_HEIGHT,m_color->data()); 0028 } 0029 0030 void KisHLineIteratorBenchmark::cleanupTestCase() 0031 { 0032 delete m_color; 0033 delete m_device; 0034 } 0035 0036 0037 void KisHLineIteratorBenchmark::benchmarkCreation() 0038 { 0039 QBENCHMARK{ 0040 KisHLineIteratorSP it = m_device->createHLineIteratorNG(0, 0, TEST_IMAGE_WIDTH); 0041 } 0042 } 0043 0044 void KisHLineIteratorBenchmark::benchmarkWriteBytes() 0045 { 0046 KisHLineIteratorSP it = m_device->createHLineIteratorNG(0, 0, TEST_IMAGE_WIDTH); 0047 0048 QBENCHMARK{ 0049 for (int j = 0; j < TEST_IMAGE_HEIGHT; j++) { 0050 do { 0051 memcpy(it->rawData(), m_color->data(), m_colorSpace->pixelSize()); 0052 } while (it->nextPixel()); 0053 it->nextRow(); 0054 } 0055 } 0056 } 0057 0058 void KisHLineIteratorBenchmark::benchmarkReadBytes() 0059 { 0060 KisHLineIteratorSP it = m_device->createHLineIteratorNG(0, 0, TEST_IMAGE_WIDTH); 0061 0062 QBENCHMARK{ 0063 for (int j = 0; j < TEST_IMAGE_HEIGHT; j++) { 0064 do { 0065 memcpy(m_color->data(), it->rawData(), m_colorSpace->pixelSize()); 0066 } while (it->nextPixel()); 0067 it->nextRow(); 0068 } 0069 } 0070 } 0071 0072 0073 void KisHLineIteratorBenchmark::benchmarkConstReadBytes() 0074 { 0075 KisHLineConstIteratorSP cit = m_device->createHLineConstIteratorNG(0, 0, TEST_IMAGE_WIDTH); 0076 0077 QBENCHMARK{ 0078 for (int j = 0; j < TEST_IMAGE_HEIGHT; j++) { 0079 do { 0080 memcpy(m_color->data(), cit->oldRawData(), m_colorSpace->pixelSize()); 0081 } while (cit->nextPixel()); 0082 cit->nextRow(); 0083 } 0084 } 0085 } 0086 0087 void KisHLineIteratorBenchmark::benchmarkReadWriteBytes(){ 0088 KoColor c(m_colorSpace); 0089 c.fromQColor(QColor(250,120,0)); 0090 KisPaintDevice dab(m_colorSpace); 0091 dab.fill(0,0,TEST_IMAGE_WIDTH,TEST_IMAGE_HEIGHT, c.data()); 0092 0093 KisHLineIteratorSP writeIterator = m_device->createHLineIteratorNG(0, 0, TEST_IMAGE_WIDTH); 0094 KisHLineConstIteratorSP constReadIterator = dab.createHLineConstIteratorNG(0, 0, TEST_IMAGE_WIDTH); 0095 0096 QBENCHMARK{ 0097 for (int j = 0; j < TEST_IMAGE_HEIGHT; j++) { 0098 do { 0099 memcpy(writeIterator->rawData(), constReadIterator->oldRawData(), m_colorSpace->pixelSize()); 0100 } while (constReadIterator->nextPixel() && writeIterator->nextPixel()); 0101 constReadIterator->nextRow(); 0102 writeIterator->nextRow(); 0103 } 0104 } 0105 } 0106 0107 0108 0109 void KisHLineIteratorBenchmark::benchmarkReadWriteBytes2() 0110 { 0111 KoColor c(m_colorSpace); 0112 c.fromQColor(QColor(255,0,0)); 0113 KisPaintDevice dab(m_colorSpace); 0114 dab.fill(0,0,TEST_IMAGE_WIDTH,TEST_IMAGE_HEIGHT, c.data()); 0115 0116 KisHLineIteratorSP writeIterator = m_device->createHLineIteratorNG(0,0,TEST_IMAGE_WIDTH); 0117 KisHLineIteratorSP readIterator = dab.createHLineIteratorNG(0,0,TEST_IMAGE_WIDTH); 0118 0119 QBENCHMARK{ 0120 for (int j = 0; j < TEST_IMAGE_HEIGHT; j++) { 0121 do { 0122 memcpy(writeIterator->rawData(), readIterator->rawData(), m_colorSpace->pixelSize()); 0123 writeIterator->nextPixel(); 0124 } while (readIterator->nextPixel()); 0125 readIterator->nextRow(); 0126 writeIterator->nextRow(); 0127 } 0128 } 0129 0130 ///QImage img = m_device->convertToQImage(m_device->colorSpace()->profile(),0,0,TEST_IMAGE_WIDTH, TEST_IMAGE_HEIGHT); 0131 //img.save("write.png"); 0132 0133 } 0134 0135 0136 void KisHLineIteratorBenchmark::benchmarkNoMemCpy() 0137 { 0138 KisHLineIteratorSP it = m_device->createHLineIteratorNG(0, 0, TEST_IMAGE_WIDTH); 0139 0140 QBENCHMARK{ 0141 for (int j = 0; j < TEST_IMAGE_HEIGHT; j++) { 0142 do {} while (it->nextPixel()); 0143 it->nextRow(); 0144 } 0145 } 0146 } 0147 0148 0149 void KisHLineIteratorBenchmark::benchmarkConstNoMemCpy() 0150 { 0151 KisHLineConstIteratorSP cit = m_device->createHLineConstIteratorNG(0, 0, TEST_IMAGE_WIDTH); 0152 0153 QBENCHMARK{ 0154 for (int j = 0; j < TEST_IMAGE_HEIGHT; j++) { 0155 do {} while (cit->nextPixel()); 0156 cit->nextRow(); 0157 } 0158 } 0159 } 0160 0161 void KisHLineIteratorBenchmark::benchmarkTwoIteratorsNoMemCpy(){ 0162 KoColor c(m_colorSpace); 0163 c.fromQColor(QColor(250,120,0)); 0164 KisPaintDevice dab(m_colorSpace); 0165 dab.fill(0,0,TEST_IMAGE_WIDTH,TEST_IMAGE_HEIGHT, c.data()); 0166 0167 KisHLineIteratorSP writeIterator = m_device->createHLineIteratorNG(0, 0, TEST_IMAGE_WIDTH); 0168 KisHLineConstIteratorSP constReadIterator = dab.createHLineConstIteratorNG(0, 0, TEST_IMAGE_WIDTH); 0169 0170 QBENCHMARK{ 0171 for (int j = 0; j < TEST_IMAGE_HEIGHT; j++) { 0172 do {} while (writeIterator->nextPixel() && constReadIterator->nextPixel()); 0173 constReadIterator->nextRow(); 0174 writeIterator->nextRow(); 0175 } 0176 } 0177 0178 } 0179 0180 0181 0182 SIMPLE_TEST_MAIN(KisHLineIteratorBenchmark)