diff --git a/czi-format/16Bit-ZStack_c_1.jpg b/czi-format/benchmark_results/16Bit-ZStack_c_1.jpg similarity index 100% rename from czi-format/16Bit-ZStack_c_1.jpg rename to czi-format/benchmark_results/16Bit-ZStack_c_1.jpg diff --git a/czi-format/16Bit-ZStack_c_2.jpg b/czi-format/benchmark_results/16Bit-ZStack_c_2.jpg similarity index 100% rename from czi-format/16Bit-ZStack_c_2.jpg rename to czi-format/benchmark_results/16Bit-ZStack_c_2.jpg diff --git a/czi-format/benchmark_results/16bit_z_stack_continuous_sorted.csv b/czi-format/benchmark_results/16bit_z_stack_continuous_sorted.csv new file mode 100644 index 0000000000000000000000000000000000000000..b21681d707a5730baff298f03ac8c1831dc6e996 --- /dev/null +++ b/czi-format/benchmark_results/16bit_z_stack_continuous_sorted.csv @@ -0,0 +1,4 @@ +filename;subblock;pixel;width;height;compression;level;originalSize;compressedSize;compressedZ;compressionRatio;compressionRatioZ;compressionTime;compressionTimeZ +16Bit-ZStack.czi;999;Gray16;0;0;GZIP;8;31457280;21313063;21067526;1.47596;1.49316;2014.00000;1985.00000 +16Bit-ZStack.czi;999;Gray16;0;0;LZMA2;8;31457280;17217716;17057428;1.82703;1.84420;15858.00000;21924.00000 +16Bit-ZStack.czi;999;Gray16;0;0;BZIP2;8;31457280;16466766;16661084;1.91035;1.88807;2958.00000;3136.00000 diff --git a/czi-format/czi-parser/compression/benchmark.h b/czi-format/czi-parser/compression/benchmark.h index c40bd5cb80af825e72a2ed700197851119f6a047..93c90e56165d6d82694643ebe9736fe92abc9670 100644 --- a/czi-format/czi-parser/compression/benchmark.h +++ b/czi-format/czi-parser/compression/benchmark.h @@ -69,131 +69,99 @@ void write_report(const std::vector<BenchmarkRecord> &results, const std::string } } +static std::vector<BenchmarkRecord> benchmark_continuos_compression_one_level(const ByteArray &data, const ByteArray &zOrderedData, int compressionLevel) +{ + + // CompressionMethod_GZIP + CompressionResult gzipResult = test_compression_method(data, CompressionMethod_GZIP, compressionLevel); + CompressionResult gzipZResult = test_compression_method(zOrderedData, CompressionMethod_GZIP, compressionLevel); + + BenchmarkRecord gzipRecord(gzipResult, gzipZResult); + gzipRecord.compressionLevel = compressionLevel; + gzipRecord.compressionMethod = GZIP_NAME; + + // CompressionMethod_LZMA + CompressionResult lzmaResult = test_compression_method(data, CompressionMethod_LZMA, compressionLevel); + CompressionResult lzmaZResult = test_compression_method(zOrderedData, CompressionMethod_LZMA, compressionLevel); + + BenchmarkRecord lzmaRecord(lzmaResult, lzmaZResult); + lzmaRecord.compressionLevel = compressionLevel; + lzmaRecord.compressionMethod = LZMA2_NAME; + + // CompressionMethod_BZIP2 + CompressionResult bzip2Result = test_compression_method(data, CompressionMethod_BZIP2, compressionLevel); + CompressionResult bzip2ZResult = test_compression_method(zOrderedData, CompressionMethod_BZIP2, compressionLevel); + + BenchmarkRecord bzip2Record(bzip2Result, bzip2ZResult); + bzip2Record.compressionLevel = compressionLevel; + bzip2Record.compressionMethod = BZIP2_NAME; + + std::vector<BenchmarkRecord> results; + results.resize(3); + results[0] = gzipRecord; + results[1] = lzmaRecord; + results[2] = bzip2Record; + return results; +} + static void benchmark_continuos_compression(CziFile &cziFile, const std::string &reportFile, bool verbose, int level = -1) { always_assert(cziFile.subBlockDirectory.entries.size() > 0); - std::vector<BenchmarkRecord> benchmarkResults; const int minCompressionLevel = 1; const int maxCompressionLevel = 9; - std::string fName = fs_wrapper::get_filename(cziFile.fileName); - - int fromCL = (level == -1) ? minCompressionLevel : minCompressionLevel; // level; - int toCL = (level == -1) ? maxCompressionLevel : maxCompressionLevel; // level; - std::vector<BenchmarkRecord> results; - results.resize((toCL - fromCL + 1) * 3); + std::string fName = fs_wrapper::get_filename(cziFile.fileName); auto entry = cziFile.subBlockDirectory.entries[0]; - // Normal order data. - { + ByteArray data = cziFile.get_continuous_image_data(false); + ByteArray zOrderData = cziFile.get_continuous_image_data(true); - ByteArray data = cziFile.get_continuous_image_data(false); - if (verbose) - printf("Loaded into memory...\n"); - int levelDone = 0; - //#pragma omp parallel for - for (int compressionLevel = fromCL; compressionLevel <= toCL; compressionLevel++) + std::vector<BenchmarkRecord> results; + if (level != -1) + { + results = benchmark_continuos_compression_one_level(data, zOrderData, level); + for (auto &&result : results) { - // CompressionMethod_GZIP - CompressionResult gzipResult = test_compression_method(data, CompressionMethod_GZIP, compressionLevel); - BenchmarkRecord gzipRecord = {}; - gzipRecord.originalSize = gzipResult.originalSize; - gzipRecord.compressedSize = gzipResult.compressedSize; - gzipRecord.compressionRatio = gzipResult.compressionRatio; - gzipRecord.compressionTime = gzipResult.compressionTimeMS; - gzipRecord.compressionLevel = compressionLevel; - gzipRecord.compressionMethod = GZIP_NAME; - results[((compressionLevel - 1) * 3)] = gzipRecord; - printf("Gzip completed. Ratio: %.5f\n", gzipResult.compressionRatio); - // CompressionMethod_LZMA - CompressionResult lzmaResult = test_compression_method(data, CompressionMethod_LZMA, compressionLevel); - BenchmarkRecord lzmaRecord = {}; - lzmaRecord.originalSize = lzmaResult.originalSize; - lzmaRecord.compressedSize = lzmaResult.compressedSize; - lzmaRecord.compressionRatio = lzmaResult.compressionRatio; - lzmaRecord.compressionTime = lzmaResult.compressionTimeMS; - lzmaRecord.compressionLevel = compressionLevel; - lzmaRecord.compressionMethod = LZMA2_NAME; - results[((compressionLevel - 1) * 3) + 1] = lzmaRecord; - printf("Lzma completed\n"); - - // CompressionMethod_BZIP2 - CompressionResult bzip2Result = test_compression_method(data, CompressionMethod_BZIP2, compressionLevel); - BenchmarkRecord bzip2Record = {}; - bzip2Record.originalSize = bzip2Result.originalSize; - bzip2Record.compressedSize = bzip2Result.compressedSize; - bzip2Record.compressionRatio = bzip2Result.compressionRatio; - bzip2Record.compressionTime = bzip2Result.compressionTimeMS; - bzip2Record.compressionLevel = compressionLevel; - bzip2Record.compressionMethod = BZIP2_NAME; - results[((compressionLevel - 1) * 3) + 2] = bzip2Record; - printf("Bzip2 completed\n"); - if (verbose) - { -#pragma omp critical - { - - printf("\rFinished compression level %i/%i of normal order.", ++levelDone, toCL); - fflush(stdout); - } - } + result.fileName = fName.c_str(); + result.subblockId = 999; + result.pixelType = cziFile.pixel_type_str(entry.pixelType); + result.width = 0; + result.height = 0; } - if (verbose) - printf("\n"); - } - // Z order data. + write_report(results, reportFile); + } + else { - ByteArray zOrderedData = cziFile.get_continuous_image_data(true); - if (verbose) - printf("Loaded into memory...\n"); int levelDone = 0; - //#pragma omp parallel for - for (int compressionLevel = fromCL; compressionLevel <= toCL; compressionLevel++) +#pragma omp parallel for + for (int compressionLevel = minCompressionLevel; compressionLevel <= maxCompressionLevel; compressionLevel++) { - // CompressionMethod_GZIP - CompressionResult gzipZResult = test_compression_method(zOrderedData, CompressionMethod_GZIP, compressionLevel); - results[((compressionLevel - 1) * 3)].zOrderCompressedSize = gzipZResult.compressedSize; - results[((compressionLevel - 1) * 3)].zOrderCompressionRatio = gzipZResult.compressionRatio; - results[((compressionLevel - 1) * 3)].zOrderCompressionTime = gzipZResult.compressionTimeMS; - printf("gzip Z completed\n"); - // CompressionMethod_LZMA - CompressionResult lzmaZResult = test_compression_method(zOrderedData, CompressionMethod_LZMA, compressionLevel); - results[((compressionLevel - 1) * 3) + 1].zOrderCompressedSize = lzmaZResult.compressedSize; - results[((compressionLevel - 1) * 3) + 1].zOrderCompressionRatio = lzmaZResult.compressionRatio; - results[((compressionLevel - 1) * 3) + 1].zOrderCompressionTime = lzmaZResult.compressionTimeMS; - printf("Lzma Z completed\n"); - // CompressionMethod_BZIP2 - CompressionResult bzip2ZResult = test_compression_method(zOrderedData, CompressionMethod_BZIP2, compressionLevel); - results[((compressionLevel - 1) * 3) + 2].zOrderCompressedSize = bzip2ZResult.compressedSize; - results[((compressionLevel - 1) * 3) + 2].zOrderCompressionRatio = bzip2ZResult.compressionRatio; - results[((compressionLevel - 1) * 3) + 2].zOrderCompressionTime = bzip2ZResult.compressionTimeMS; - printf("Bzip2 Z completed\n"); - if (verbose) - { + auto levelResults = benchmark_continuos_compression_one_level(data, zOrderData, compressionLevel); #pragma omp critical - { - printf("\rFinished compression level %i/%i of Z order.", ++levelDone, toCL); - fflush(stdout); - } + { + results.insert(results.end(), levelResults.begin(), levelResults.end()); + printf("\rFinished compression level %i/%i of normal order.", ++levelDone, maxCompressionLevel); + fflush(stdout); } } if (verbose) printf("\n"); } - for (size_t i = 0; i < results.size(); i++) + for (auto &&result : results) { - results[i].fileName = fName.c_str(); - results[i].subblockId = 999; - results[i].pixelType = cziFile.pixel_type_str(entry.pixelType); - results[i].width = 0; - results[i].height = 0; + result.fileName = fName.c_str(); + result.subblockId = 999; + result.pixelType = cziFile.pixel_type_str(entry.pixelType); + result.width = 0; + result.height = 0; } if (verbose) printf("\nWriting report file...\n"); + write_report(results, reportFile); printf("\nFinished benchmark, results are written in: %s\n", reportFile.c_str()); diff --git a/czi-format/czi-parser/czi_file.cpp b/czi-format/czi-parser/czi_file.cpp index 868ea7531d3dd86c763ba4ec35e3203d9c1b195e..0860e517678a43fe778076d044cfff01ed09c5a2 100644 --- a/czi-format/czi-parser/czi_file.cpp +++ b/czi-format/czi-parser/czi_file.cpp @@ -380,7 +380,7 @@ ByteArray CziFile::get_continuous_image_data(const bool ZCurveOrdered) const vecUtil::vector_insert_at(data, zOrderSubblockData, bufferEnd, 0, zOrderSubblockData.size()); bufferEnd += zOrderSubblockData.size(); - printf("\rLoaded subblock %i/%i", ++loaded, (int)subBlockDirectory.entries.size()); + printf("\rLoaded Z-ordered subblock %i/%i", ++loaded, (int)subBlockDirectory.entries.size()); fflush(stdout); } }