klauspost/compress

开发工具

给 Go 开发者用的优化压缩库,想让 gzip/zstd/snappy 更快又不想换数据格式时值得看。

5,704
422
Go
NOASSERTION
创建于 11 年前

如果 Go 服务在压缩或解压上花掉了可观的时间,这个库值得评估。多数团队的接入成本只是改一行 import 路径,但 README 里的速度数字是作者自测的,不是针对你的数据做的独立基准。

解决什么问题

一个用标准库压缩 HTTP 响应、写 zip 文件或存压缩数据的 Go 服务,实际上没有主动选过吞吐量,只能接受默认表现。常规做法要么忍受开销,要么换一种压缩格式,而换格式意味着改序列化代码、存量文件和所有读取方。这个项目保留相同的格式和 API,团队只改 import 路径就能继续读写同样的 gzip、zlib、zip 或 flate 数据。结果格式不变,速度特性不同。

有什么不同

这个模块里其实有三类东西。第一类是 deflate 系列,文档说明它们是 gzip、zlib、zip 的直接替换,按作者自己的数字典型速度约为标准库的 2 倍;需要时也可以用构建标签关掉汇编或 unsafe。第二类是纯 Go 的 zstandard 实现,以及被描述为 Snappy 高性能替代的 S2,还有可直接替换 github.com/golang/snappy 的 snappy 包。第三类是更底层的熵编码器和解码器,覆盖较窄的场景,比如 huff0、FSE、lzw,以及用于 WIM/Compact OS 数据的微软 XPRESS 解码 xpress。

主要代价是:这里的“直接替换”指 API 兼容,不保证行为完全一致。最新发布说明里能看到类型很具体的边界问题:复用的 zstd frame 解码器现在会应用 reset 选项,截断的 Huffman 额外位现在会报 unexpected EOF,gzhttp 里的请求头问题也修了 发布说明。文档还明确说无状态 gzip 压缩在体积和速度上都不是最优,只适用于大量并发但几乎不活动的压缩器。如果你依赖字节级完全相同的输出、特定错误字符串或特定内存表现,这些需要自己核对,不能假定。

谁值得试

适合:已经在用标准库 gzip 压缩 HTTP 流量的 Go 后端,或读写 Snappy、zstd 数据且吞吐量重要、格式又不能变的服务。需要纯 Go 的 zstd 路径、不想引入 cgo,或者想用构建标签去掉汇编和 unsafe 的团队也适合。不适合:本来就需要换一种新格式,或者必须在精确负载上看到独立基准才肯切换,以及不用 Go 的项目,因为这是 Go 专用库。另一个边界是它不会自动并行压缩 gzip,README 指向单独的 pgzip 项目来做大文件多线程压缩。

使用条件与边界

安装命令在 README 里,对已有 Go 模块的接入很简单。真正的约束是兼容性:项目只支持当前 Go 版本往前两个版本 项目说明,工具链较旧时会把你留在旧版依赖上。优化路径默认依赖汇编和 unsafe;noasm 和 nounsafe 标签是退路,但 README 没有承诺关掉之后速度一样。日常维护主要是跟版本,而不是配置。项目 changelog 更新稳定,最近的修复包括 zstd 解码器 reset 行为、flate 截断输入处理以及 gzhttp transport 请求头问题 发布说明。升级版本时最好读一下这类说明,尤其是压缩数据要跨服务传递的场景。

HotRepo 点评

HotRepo 从 2026-05-10 开始跟踪这个仓库;唯一记录到的日榜观测是 2026-10-27,当天 5,702 星,新增 3 星。单个日期的快照无法说明关注度是在上升还是下降,因此不能据此判断热度是否持续。对这样一个已有十年的库,一次上榜不如 changelog 的纪律性重要。切换前值得核对一个兼容点:你的代码是否依赖 gzip/flate 的精确错误行为或输出字节,因为最近的版本改过前者。

Hacker News 讨论

S2 Compression
▲ 8 · 0 条评论 · 2022年9月5日
GitHub – fast zstd compressor in pure Go
▲ 4 · 0 条评论 · 2019年6月2日
Optimized Go gzip/zip packages, 30-50% faster
▲ 2 · 0 条评论 · 2015年7月28日

本文由 AI 根据项目 README 生成,更新于 2026年10月27日,以项目官方文档为准。