diff --git a/CMakeLists.txt b/CMakeLists.txt index 7d933a6..a6f7d1c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,7 +36,9 @@ install(TARGETS XISF PUBLIC_HEADER) enable_testing() -add_executable(LibXISFTest test/main.cpp) +add_executable(LibXISFTest + test/main.cpp + test/benchmark.cpp) target_link_libraries(LibXISFTest XISF) diff --git a/test/benchmark.cpp b/test/benchmark.cpp new file mode 100644 index 0000000..68c4e16 --- /dev/null +++ b/test/benchmark.cpp @@ -0,0 +1,110 @@ +#include +#include +#include +#include "libxisf.h" + +using namespace LibXISF; + +template +void benchmarkType(float avg, float stdDev) +{ + std::mt19937 gen; + std::normal_distribution normalDist {avg, stdDev}; + + UInt32 pixels = 2048*2048; + UInt32 size = pixels*sizeof(T); + QByteArray imageData; + imageData.resize(size); + T *ptr = (T*)imageData.data(); + for(UInt32 i=0; i < pixels; i++) + { + ptr[i] = normalDist(gen); + } + + QElapsedTimer timer; + Image image; + image.width = 2048; + image.height = 2048; + image.dataBlock.data = imageData; + double baseSize; + + { + timer.start(); + XISFWriter writer; + writer.writeImage(image); + QByteArray xisfImage; + writer.save(xisfImage); + baseSize = xisfImage.size(); + std::cout << "No compression \tElapsed time: " << timer.elapsed() << " " << "ms\tSpeed: " + << size/1024.0/1.024/timer.elapsed() << "MiB/s" << std::endl; + } + { + image.dataBlock.codec = DataBlock::Zlib; + timer.start(); + XISFWriter writer; + writer.writeImage(image); + QByteArray xisfImage; + writer.save(xisfImage); + std::cout << "Zlib compression \tElapsed time: " << timer.elapsed() << " " << "ms\tSpeed: " + << size/1024.0/1.024/timer.elapsed() << "MiB/s\tRatio: " << baseSize/xisfImage.size() << std::endl; + } + { + image.dataBlock.codec = DataBlock::LZ4; + timer.start(); + XISFWriter writer; + writer.writeImage(image); + QByteArray xisfImage; + writer.save(xisfImage); + std::cout << "LZ4 compression \tElapsed time: " << timer.elapsed() << " " << "ms\tSpeed: " + << size/1024.0/1.024/timer.elapsed() << "MiB/s\tRatio: " << baseSize/xisfImage.size() << std::endl; + } + { + image.dataBlock.codec = DataBlock::LZ4HC; + timer.start(); + XISFWriter writer; + writer.writeImage(image); + QByteArray xisfImage; + writer.save(xisfImage); + std::cout << "LZ4HC compression \tElapsed time: " << timer.elapsed() << " " << "ms\tSpeed: " + << size/1024.0/1.024/timer.elapsed() << "MiB/s\tRatio: " << baseSize/xisfImage.size() << std::endl; + } + image.dataBlock.byteShuffling = sizeof(T); + { + image.dataBlock.codec = DataBlock::Zlib; + timer.start(); + XISFWriter writer; + writer.writeImage(image); + QByteArray xisfImage; + writer.save(xisfImage); + std::cout << "Zlib compression SH \tElapsed time: " << timer.elapsed() << " " << "ms\tSpeed: " + << size/1024.0/1.024/timer.elapsed() << "MiB/s\tRatio: " << baseSize/xisfImage.size() << std::endl; + } + { + image.dataBlock.codec = DataBlock::LZ4; + timer.start(); + XISFWriter writer; + writer.writeImage(image); + QByteArray xisfImage; + writer.save(xisfImage); + std::cout << "LZ4 compression SH \tElapsed time: " << timer.elapsed() << " " << "ms\tSpeed: " + << size/1024.0/1.024/timer.elapsed() << "MiB/s\tRatio: " << baseSize/xisfImage.size() << std::endl; + } + { + image.dataBlock.codec = DataBlock::LZ4HC; + timer.start(); + XISFWriter writer; + writer.writeImage(image); + QByteArray xisfImage; + writer.save(xisfImage); + std::cout << "LZ4HC compression SH\tElapsed time: " << timer.elapsed() << " " << "ms\tSpeed: " + << size/1024.0/1.024/timer.elapsed() << "MiB/s\tRatio: " << baseSize/xisfImage.size() << std::endl; + } +} + +void benchmark() +{ + std::cout << "UInt16 sample type" << std::endl; + benchmarkType(500, 30); + std::cout << "Float32 sample type" << std::endl; + benchmarkType(500 / 65535.0, 30 / 65535.0); +} diff --git a/test/main.cpp b/test/main.cpp index f3063c0..d0c8002 100644 --- a/test/main.cpp +++ b/test/main.cpp @@ -21,6 +21,8 @@ using namespace LibXISF; +void benchmark(); + #define TEST(cond, msg) if(cond){ std::cerr << msg << std::endl; return 1; } int main(int argc, char **argv) @@ -68,6 +70,10 @@ int main(int argc, char **argv) TEST(image.dataBlock.data != img0.dataBlock.data, "Images doesn't match"); TEST(img0.dataBlock.data != img1.dataBlock.data, "Images doesn't match"); } + else if(argc == 2 && argv[1] == QString("bench")) + { + benchmark(); + } else { LibXISF::XISFReader reader;