snappy-library 1.1.2

snappy-library 1.1.2

测试已测试
Lang语言 C++C++
许可证 BSD 3.0
发布上次发布2017年3月

Russell Hancox 维护。



  • Google Inc.

Snappy,一种快速的压缩/解压库。

简介

Snappy 是一个压缩/解压库。它不追求最大的压缩效果,或与其他任何压缩库兼容;相反,它追求极高的速度和合理的压缩。例如,与 zlib 的最快模式相比,Snappy 对于大多数输入来说要快一个数量级,但生成的压缩文件大小从 20% 到 100% 不等。(更多信息,请见下文的“性能”。)

Snappy 具有以下特性

  • 快速:压缩速度达到 250 MB/sec 及以上,没有任何汇编代码。请见下文的“性能”。
  • 稳定:在过去的几年里,Snappy 在 Google 的生产环境中压缩和解压了皮仞字节的数据。Snappy 的比特流格式是稳定的,版本之间不会发生变化。
  • 健壮:Snappy 的解压器被设计为面对损坏或恶意输入不会崩溃。
  • 免费和开源软件:Snappy 使用类似 BSD 许可证。更多信息,请见包含的 COPYING 文件。

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 兼容处理器优化的,在其他环境中可能运行得更慢。特别是

  • Snappy 在几个地方使用 64 位操作来同时处理比通常可能处理的数据更多。
  • Snappy 假设 32 位和 64 位的非对齐加载和存储是便宜的。在某些平台上,这些必须通过单字节加载和存储来模拟,这要慢得多。
  • Snappy 假设整个都是小端,如果在大端平台上运行,需要将数据字节顺序转换。

经验表明,即使是经过高度调优的代码仍有改进空间。对于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分发。有关最新版本、错误跟踪器和其他信息,请参阅

http://code.google.com/p/snappy/