--- a/snappy_unittest.cc +++ b/snappy_unittest.cc @@ -57,6 +57,8 @@ DEFINE_bool(liblzf, false, "(http://www.goof.com/pcg/marc/liblzf.html)"); DEFINE_bool(fastlz, false, "Run FastLZ compression (http://www.fastlz.org/"); +DEFINE_bool(csnappy, false, + "Run csnappy compression (https://github.com/zeevt/csnappy/)"); DEFINE_bool(snappy, true, "Run snappy compression"); @@ -121,11 +123,11 @@ typedef string DataEndingAtUnreadablePage; #endif enum CompressorType { - ZLIB, LZO, LIBLZF, QUICKLZ, FASTLZ, SNAPPY + ZLIB, LZO, LIBLZF, QUICKLZ, FASTLZ, CSNAPPY, SNAPPY, }; const char* names[] = { - "ZLIB", "LZO", "LIBLZF", "QUICKLZ", "FASTLZ", "SNAPPY" + "ZLIB", "LZO", "LIBLZF", "QUICKLZ", "FASTLZ", "CSNAPPY", "SNAPPY", }; static size_t MinimumRequiredOutputSpace(size_t input_size, @@ -156,6 +158,12 @@ static size_t MinimumRequiredOutputSpace(size_t input_size, return max(static_cast(ceil(input_size * 1.05)), 66); #endif // FASTLZ_VERSION +#ifdef CSNAPPY_VERSION + case CSNAPPY: + return static_cast(csnappy_max_compressed_length( + static_cast(input_size))); +#endif // CSNAPPY_VERSION + case SNAPPY: return snappy::MaxCompressedLength(input_size); @@ -266,6 +274,24 @@ static bool Compress(const char* input, size_t input_size, CompressorType comp, } #endif // FASTLZ_VERSION +#ifdef CSNAPPY_VERSION + case CSNAPPY: { + uint32_t destlen; + char* mem = new char[CSNAPPY_WORKMEM_BYTES]; + csnappy_compress(input, input_size, + string_as_array(compressed), + &destlen, + mem, + CSNAPPY_WORKMEM_BYTES_POWER_OF_TWO); + delete[] mem; + CHECK_LE(destlen, csnappy_max_compressed_length(input_size)); + if (!compressed_is_preallocated) { + compressed->resize(destlen); + } + break; + } +#endif // CSNAPPY_VERSION + case SNAPPY: { size_t destlen; snappy::RawCompress(input, input_size, @@ -364,9 +390,23 @@ static bool Uncompress(const string& compressed, CompressorType comp, } #endif // FASTLZ_VERSION +#ifdef CSNAPPY_VERSION + case CSNAPPY: { + int ret = csnappy_decompress( + compressed.data(), + (uint32_t)compressed.size(), + string_as_array(output), + (uint32_t)size); + CHECK_EQ(ret, CSNAPPY_E_OK); + break; + } +#endif // CSNAPPY_VERSION + case SNAPPY: { - snappy::RawUncompress(compressed.data(), compressed.size(), - string_as_array(output)); + bool ret = snappy::RawUncompress(compressed.data(), + compressed.size(), + string_as_array(output)); + CHECK_EQ(ret, true); break; } @@ -464,7 +504,7 @@ static void Measure(const char* data, string urate = (uncomp_rate >= 0) ? StringPrintf("%.1f", uncomp_rate) : string("?"); - printf("%-7s [b %dM] bytes %6d -> %6d %4.1f%% " + printf("%-8s [b %dM] bytes %6d -> %6d %4.1f%% " "comp %5.1f MB/s uncomp %5s MB/s\n", x.c_str(), block_size/(1<<20), @@ -1013,6 +1053,7 @@ static void MeasureFile(const char* fname) { if (FLAGS_liblzf) Measure(input, len, LIBLZF, repeats, 1024<<10); if (FLAGS_quicklz) Measure(input, len, QUICKLZ, repeats, 1024<<10); if (FLAGS_fastlz) Measure(input, len, FASTLZ, repeats, 1024<<10); + if (FLAGS_csnappy) Measure(input, len, CSNAPPY, repeats, 1024<<10); if (FLAGS_snappy) Measure(input, len, SNAPPY, repeats, 4096<<10); // For block-size based measurements