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_vline_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 #include <kis_iterator_ng.h> 0016 #include <simpletest.h> 0017 0018 0019 void KisVLineIteratorBenchmark::initTestCase() 0020 { 0021 m_colorSpace = KoColorSpaceRegistry::instance()->rgb8(); 0022 m_device = new KisPaintDevice(m_colorSpace); 0023 m_color = new KoColor(m_colorSpace); 0024 // some random color 0025 m_color->fromQColor(QColor(0,120,250)); 0026 m_device->fill(0,0,TEST_IMAGE_WIDTH,TEST_IMAGE_HEIGHT,m_color->data()); 0027 } 0028 0029 void KisVLineIteratorBenchmark::cleanupTestCase() 0030 { 0031 delete m_color; 0032 delete m_device; 0033 } 0034 0035 0036 void KisVLineIteratorBenchmark::benchmarkCreation() 0037 { 0038 QBENCHMARK{ 0039 KisVLineIteratorSP it = m_device->createVLineIteratorNG(0, 0, TEST_IMAGE_HEIGHT); 0040 } 0041 } 0042 0043 void KisVLineIteratorBenchmark::benchmarkWriteBytes() 0044 { 0045 KisVLineIteratorSP it = m_device->createVLineIteratorNG(0, 0, TEST_IMAGE_HEIGHT); 0046 0047 QBENCHMARK{ 0048 for (int j = 0; j < TEST_IMAGE_WIDTH; j++) { 0049 do { 0050 memcpy(it->rawData(), m_color->data(), m_colorSpace->pixelSize()); 0051 } while (it->nextPixel()); 0052 it->nextColumn(); 0053 } 0054 } 0055 } 0056 0057 0058 void KisVLineIteratorBenchmark::benchmarkReadBytes() 0059 { 0060 KisVLineIteratorSP it = m_device->createVLineIteratorNG(0, 0, TEST_IMAGE_HEIGHT); 0061 0062 QBENCHMARK{ 0063 for (int j = 0; j < TEST_IMAGE_WIDTH; j++) { 0064 do { 0065 memcpy(m_color->data(), it->rawData(), m_colorSpace->pixelSize()); 0066 } while (it->nextPixel()); 0067 it->nextColumn(); 0068 } 0069 } 0070 } 0071 0072 0073 void KisVLineIteratorBenchmark::benchmarkConstReadBytes() 0074 { 0075 KisVLineConstIteratorSP it = m_device->createVLineConstIteratorNG(0, 0, TEST_IMAGE_HEIGHT); 0076 0077 QBENCHMARK{ 0078 for (int j = 0; j < TEST_IMAGE_WIDTH; j++) { 0079 do { 0080 memcpy(m_color->data(), it->oldRawData(), m_colorSpace->pixelSize()); 0081 } while (it->nextPixel()); 0082 it->nextColumn(); 0083 } 0084 } 0085 } 0086 0087 void KisVLineIteratorBenchmark::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 KisVLineIteratorSP writeIterator = m_device->createVLineIteratorNG(0, 0, TEST_IMAGE_HEIGHT); 0094 KisVLineConstIteratorSP constReadIterator = dab.createVLineConstIteratorNG(0, 0, TEST_IMAGE_HEIGHT); 0095 0096 QBENCHMARK{ 0097 for (int j = 0; j < TEST_IMAGE_WIDTH; j++) { 0098 do { 0099 memcpy(writeIterator->rawData(), constReadIterator->oldRawData(), m_colorSpace->pixelSize()); 0100 } while (constReadIterator->nextPixel() && writeIterator->nextPixel()); 0101 constReadIterator->nextColumn(); 0102 writeIterator->nextColumn(); 0103 } 0104 } 0105 0106 } 0107 0108 void KisVLineIteratorBenchmark::benchmarkNoMemCpy() 0109 { 0110 KisVLineIteratorSP it = m_device->createVLineIteratorNG(0, 0, TEST_IMAGE_HEIGHT); 0111 0112 QBENCHMARK{ 0113 for (int j = 0; j < TEST_IMAGE_WIDTH; j++) { 0114 do { 0115 } while (it->nextPixel()); 0116 it->nextColumn(); 0117 } 0118 } 0119 } 0120 0121 0122 0123 0124 void KisVLineIteratorBenchmark::benchmarkConstNoMemCpy() 0125 { 0126 KisVLineConstIteratorSP it = m_device->createVLineConstIteratorNG(0, 0, TEST_IMAGE_HEIGHT); 0127 0128 QBENCHMARK{ 0129 for (int j = 0; j < TEST_IMAGE_WIDTH; j++) { 0130 do {} while (it->nextPixel()); 0131 it->nextColumn(); 0132 } 0133 } 0134 } 0135 0136 0137 void KisVLineIteratorBenchmark::benchmarkTwoIteratorsNoMemCpy() 0138 { 0139 KoColor c(m_colorSpace); 0140 c.fromQColor(QColor(250,120,0)); 0141 KisPaintDevice dab(m_colorSpace); 0142 dab.fill(0,0,TEST_IMAGE_WIDTH,TEST_IMAGE_HEIGHT, c.data()); 0143 0144 KisVLineIteratorSP writeIterator = m_device->createVLineIteratorNG(0, 0, TEST_IMAGE_HEIGHT); 0145 KisVLineConstIteratorSP constReadIterator = dab.createVLineConstIteratorNG(0, 0, TEST_IMAGE_HEIGHT); 0146 0147 QBENCHMARK{ 0148 for (int j = 0; j < TEST_IMAGE_WIDTH; j++) { 0149 do {} while (constReadIterator->nextPixel() && writeIterator->nextPixel()); 0150 constReadIterator->nextColumn(); 0151 writeIterator->nextColumn(); 0152 } 0153 } 0154 } 0155 0156 0157 SIMPLE_TEST_MAIN(KisVLineIteratorBenchmark)