Snappy,一种快速的压缩/解压库。
Snappy 是一个压缩/解压库。它不追求最大的压缩效果,或与其他任何压缩库兼容;相反,它追求极高的速度和合理的压缩。例如,与 zlib 的最快模式相比,Snappy 对于大多数输入来说要快一个数量级,但生成的压缩文件大小从 20% 到 100% 不等。(更多信息,请见下文的“性能”。)
Snappy 具有以下特性
Snappy 在一些 Google 演示文稿等地方曾被命名为“Zippy”。
Snappy 的目标是快速。在一个 Core i7 处理器单核 64 位模式下,它的压缩速度约为 250 MB/sec 或更高,解压速度约为 500 MB/sec 或更高。(这些数字是我们基准套件中最慢的输入;其他速度更快。)在我们的测试中,Snappy 通常比同一类别的算法(例如 LZO、LZF、FastLZ、QuickLZ 等)更快,同时实现可比的压缩比率。
典型的压缩比率(基于基准套件)大约是纯文本 1.5-1.7 倍,HTML 2-4 倍,而对于 JPEG、PNG 和其他已经压缩的数据,则为 1.0 倍。在最高模式下,zlib 的相应数字分别为 2.6-2.8 倍、3-7 倍和 1.0 倍。更复杂的算法可以实现更高的压缩率,尽管通常以速度为代价。当然,压缩率会根据输入有很大的变化。
尽管 Snappy 应该相当便携,但它主要是针对 64 位 x86 兼容处理器优化的,在其他环境中可能运行得更慢。特别是
经验表明,即使是经过高度调优的代码仍有改进空间。对于64位x86或其他平台,性能优化当然是受欢迎的;请参见下方的“联系”。
请注意,Snappy的实现在主接口方面都是用C++编写的。然而,也有很多其他语言的第三方绑定可用;有关更多信息,请参阅Google代码页面 http://code.google.com/p/snappy/。另外,如果您想从C代码中使用Snappy,可以使用“snappy-c.h”中包含的C绑定。
要从您自己的C++程序中使用Snappy,请在调用文件中包含“snappy.h”文件,并与编译后的库链接。
调用Snappy有许多方法,但最简单的方法是
snappy::Compress(input.data(), input.size(), &output);
同样地,
snappy::Uncompress(input.data(), input.size(), &output);
其中“input”和“output”都是std::string的实例。
还有其他一些接口在不同方面更灵活,包括支持自定义(非数组)输入源。有关更多信息,请参阅头文件。
当您编译Snappy时,除了库本身,还会编译snappy_unittest。您不需要它就可以从自己的库中使用压缩器,但它包含了一些Snappy开发的有用组件。
首先,它包含单元测试,验证在各种情况下在本机的正确性。如果您想更改或优化Snappy,请运行测试以验证您没有出错。请注意,如果您安装了Google Test库,单元测试行为(尤其是失败)将会显著更加友好。您可以在 http://code.google.com/p/googletest/ 找到Google Test。
您可能还需要使用gflags库来处理命令行标志;您可以在 http://code.google.com/p/google-gflags/ 找到它。
除了单元测试,snappy还包含了一些用于调整压缩和解压性能的微基准测试。这些基准测试将在单元测试之前自动运行,但如果您安装了gflags,可以使用标签--run_microbenchmarks=false禁用它们(否则您需要编辑源代码)。
最后,如果配置时检测到其他压缩库(zlib、LZO、LZF、FastLZ和QuickLZ),Snappy可以与它们进行基准测试。要在给定文件上进行基准测试,指定您想测试Snappy的压缩算法(例如--zlib),然后列出要测试的一个或多个文件名。testdata/目录包含微基准测试使用的文件,应提供基准测试的合理起点。(注意,baddata[1-3].snappy不是作为基准测试设计的;它们用于验证在单元测试中存在损坏数据时的正确性。)
Snappy通过Google Code分发。有关最新版本、错误跟踪器和其他信息,请参阅