落星坠

Snappy

互联网 2024-06-16 06:10:24

Snappy 是一个压缩 / 解压缩库。它不旨在最大程度地压缩,也不旨在与任何其他压缩库兼容。相反,它的目标是非常高的速度和合理的压缩。例如,与 zlib 的最快模式相比,Snappy 对于大多数输入而言要快一个数量级,但是生成的压缩文件要大 20%至 100%。(有关更多信息,请参见下面的 “性能”。)

Snappy 具有以下属性:

  • 快速:压缩速度达到 250 MB / 秒及以上,无需汇编代码。请参阅下面的 “性能”。

  • 稳定:在过去的几年中,Snappy 已在 Google 的生产环境中压缩和解压缩了 PB 级的数据。Snappy 位流格式是稳定的,不会在版本之间更改。

  • 稳健:Snappy 解压缩器的设计不会在遭到损坏或恶意输入时崩溃。

  • 免费和开源软件:Snappy 已获得 BSD 类型许可证的许可。有关更多信息,请参见随附的 COPYING 文件。

Snappy 在某些 Google 演示文稿等中以前被称为 “Zippy”。

性能

Snappy 的目的是要快。在 64 位模式的 Core i7 处理器的单核上,它以约 250 MB /sec 或更高的速度压缩,并以约 500 MB /sec 或更高的速度解压缩。(这些数字是我们基准测试套件中输入速度最慢的数字;其他数字则更快。)在我们的测试中,Snappy 通常比同级别的算法(例如 LZO,LZF,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::Compress(input.data(), input.size(), &output);