File indexing completed on 2024-05-05 16:28:43

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)