ZXC:为超快速解压而生的无损压缩
摘要
ZXC 0.15.0 正式发布,这是一款面向“一次压缩、多次解压”场景的无损压缩库 libzxc,采用 C 编写,解压速度可达每秒数 GB,其各级别的解码速度均为 LZ4 的 1.5–2.8 倍,且输出体积相等或更小。
<p><a href="https://lobste.rs/s/mf3tmv/zxc_lossless_compression_built_for_ultra">评论</a></p>
查看缓存全文
缓存时间: 2026/10/14 16:11
# ZXC:为超快解压而生的无损压缩
来源:https://libzxc.org/
ZXC 是一个用 C 编写的无损数据压缩库,以 **libzxc** 的形式分发。它专为"一次压缩、多次读取"的数据设计:固件镜像、游戏资源、应用程序包以及分发到大量设备的内容。编码器在前期花费更多时间,使解压速度在 ARM 和 x86 上可达每秒数 GB。在所有压缩级别下,ZXC 的解码速度都快于 LZ4,且输出体积相同或更小。
ZXC 是自由软件,以 BSD 3-Clause License(https://opensource.org/license/bsd-3-clause)发布。它没有任何依赖,并提供 Rust、Python、Node.js 和 Go 的官方绑定。
开发在 GitHub(https://github.com/hellobertrand/zxc)上进行。
**当前版本为 ZXC 0.15.0**,发布于 2026-10-13。变更内容请参阅[更新日志](https://libzxc.org/docs/changelog/),下载方式见下方的[下载 ZXC](https://libzxc.org/#download)。
## 与相近体积编解码器的解压速度对比
**Fast** 61.76% of original
| | |
|---|---|
| zxc -1 | 13,513 MB/s |
| lz4 --fast -1 | 75,609 MB/s |
**2.41× 更快**解码,输出更小(61.76% vs 62.15%)
**Default** 46.65% of original
| | |
|---|---|
| zxc -3 | 9,707 MB/s |
| lz4 | 4,774 MB/s |
**2.03× 更快**解码,输出更小(46.65% vs 47.60%)
**High** 36.28% of original
| | |
|---|---|
| zxc -6 | 6,884 MB/s |
| lz4hc -9 | 4,522 MB/s |
**1.52× 更快**解码,输出更小(36.28% vs 36.75%)
**Ultra** 33.09% of original
| | |
|---|---|
| zxc -7 | 5,054 MB/s |
| zstd -11 | 803 MB/s |
**2.80× 更快**解码,输出更小(33.09% vs 34.53%)
**图 1.** `silesia.tar`(211.9 MB)的单线程解压,使用 lzbench 2.4.1 和 zxc 0.15.0 测量。ZXC 的 1、3、6、7 级别分别与输出体积相近的编解码器进行对比。测试平台:Apple M2,macOS 26,Clang 21,`-march=native`。完整结果见[基准测试表](https://libzxc.org/#benchmarks)。
## 规格
## 为什么选择 ZXC?
LZ4 是对称的:压缩速度和解压速度大致相同。这适合日志和交换空间,但不适合需要分发的数据。固件镜像在构建服务器上只压缩一次,然后在每台安装它的设备上解压,因此压缩阶段节省的时间对谁都没有帮助。
ZXC 把工作量转移到编码器。匹配选择、最优解析和统计调优只做一次,码流布局针对现代处理器的流水线和分支预测器进行优化。解码器保持简短、分支极少,并在可用时使用 SIMD。
典型用途:
- 固件和空中下载(OTA)更新。就地解压使峰值内存接近解压后大小。
- 游戏资源和应用启动,加载时间和电池消耗都很重要。
- 打包产物和内容分发,从磁盘或网络读取的每字节可以传输更多原始数据。
- 读密集型存储。可寻址归档可以不解读前面的块就直接解码任意块。
## 特性
- **可寻址归档。** 可选的寻址表提供对任意块的 O(1) 随机访问。
- **就地解压。** 在单个缓冲区内解码,开销仅约 1%,无需额外分配。
- **训练字典。** `zxc --train` 为小型相似负载(如 JSON 文档、日志行或 RPC 消息)构建字典。
- **多线程流式处理。** 文件和流接口可以在处理器核心之间分配工作。
- **手写 SIMD。** x86 上支持 SSE2、AVX2 和 AVX-512,运行时选择;ARMv8 及以上支持 NEON。
- **可移植。** 在 x86_64、ARM64、ARMv7、ARMv6、RISC-V、POWER、s390x 和 i386 上经过测试。
- **严谨的接口。** 每次调用都需要显式的输出容量。库是线程安全的,提供可复用上下文用于紧密循环,以及静态上下文用于无堆的环境。
- **可选校验和。** 基于 rapidhash 的逐块完整性校验。
- **文档化的格式。** 线上格式(wire format)(https://libzxc.org/docs/format/)(版本 9)有完整规范,公开的一致性测试向量允许他人编写独立解码器。
## 压缩级别
七个级别以压缩时间换取体积。在所有级别下解压速度都保持在多 GB/s 范围。级别 3 为默认值。
体积为压缩后大小占 `silesia.tar` 的百分比。速度为 Apple M2 上使用 lzbench 2.4.1 的单线程数据。默认块大小为 512 KB;流式处理或内存受限的目标请使用 `-B 256K`。
## 基准测试
ZXC 已被纳入两个主要的开源压缩基准测试套件:[lzbench](https://github.com/inikep/lzbench) 和 [TurboBench](https://github.com/powturbo/TurboBench),因此下面的数据可以用任一工具复现,并与其他 70 多种编解码器进行比较。基准测试也在每次提交时在 x86_64 和 ARM64 机器上运行;参见[最新结果](https://github.com/hellobertrand/zxc/actions/workflows/benchmark.yml)。
ZXC、LZ4、Zstandard、LZAV、Snappy 和 zlib 的压缩率与解压速度对比图,含帕累托前沿,每个处理器一个面板:Apple M2、Google Axion、AMD EPYC 9B45 和 AMD EPYC 7B13。ZXC 的所有级别都在前沿上。(https://libzxc.org/docs/images/bench-pareto-decompression.svg)
**图 2.** `silesia.tar` 的压缩率与单线程解压速度(对数刻度)对比,在两台 ARM64 和两台 x86_64 处理器上;越靠右上越好。来自[白皮书](https://libzxc.org/docs/whitepaper/)。
解码器的速度是在压缩阶段付出的代价,在这个维度上 LZ4 和 Zstandard 领先。级别 1 和 2 的压缩速度仍可达数百 MB/s;级别 6 和 7 约为 10 MB/s,慢于 `lz4hc -9`,专为一次压缩、多次读取的数据设计。
ZXC、LZ4、Zstandard、LZAV、Snappy 和 zlib 的压缩率与压缩速度对比图(对数刻度),含帕累托前沿,每个处理器一个面板:Apple M2、Google Axion、AMD EPYC 9B45 和 AMD EPYC 7B13。(https://libzxc.org/docs/images/bench-pareto-compression.svg)
**图 3.** `silesia.tar` 的压缩率与单线程压缩速度(对数刻度)对比,同样四款处理器;越靠右上越好。来自[白皮书](https://libzxc.org/docs/whitepaper/)。
裸解压速度只反映了一半的情况。当解码器的输入来自磁盘、网络或另一个核心时,稀缺的是压缩字节,关键在于每压缩兆字节能还原多少原始数据。有效吞吐量综合了两者:解压速度 × 100 / 体积百分比(%)。在这一指标上,ZXC 的所有级别在所有四款处理器上都领先于 LZ4。
ZXC 所有级别以及 LZ4、LZ4HC、LZAV、Zstandard 和 Snappy 相对于 LZ4 的有效吞吐量,在 Apple M2、Google Axion、AMD EPYC 9B45 和 AMD EPYC 7B13 上。ZXC 的所有级别都在 LZ4 基准线 1.00 之上。(https://libzxc.org/docs/images/bench-effective.svg)
**图 4.** 有效吞吐量(解压速度 × 100 / 体积百分比 %)相对于 LZ4 的比值,同样四款处理器;越高越好,LZ4 为 1.00。来自[白皮书](https://libzxc.org/docs/whitepaper/)。
用时钟频率除以解压速度,得到每个解压字节的处理器周期开销,可以在不同频率运行的处理器之间进行比较。ZXC 在所有级别下每字节的开销都不超过一个周期。
ZXC 所有级别以及 memcpy、LZ4、LZ4HC、LAV、Snappy 和 Zstandard 在 Apple M2、Google Axion、AMD EPYC 9B45 和 AMD EPYC 7B13 上每解压字节的处理器周期。(https://libzxc.org/docs/images/bench-cycles.svg)
**图 5.** 每解压字节的处理器周期(时钟频率 / 解压速度),同样四款处理器;越低越好。来自[白皮书](https://libzxc.org/docs/whitepaper/)。
**Apple M2**(ARM64)Apple M2,macOS 26,Clang 21,`-march=native`。单线程,lzbench 2.4.1,`silesia.tar`。速度单位 MB/s;体积为输入的百分比。
**Google Axion**(ARM64)Google Axion(Neoverse V2),GCP C4A,GCC 14.4,`-march=native`。单线程,lzbench 2.4.1,`silesia.tar`。速度单位 MB/s;体积为输入的百分比。
**AMD EPYC 9B45**(x86_64)AMD EPYC 9B45(Zen 5),GCP C4D,GCC 14.4,`-march=native`。单线程,lzbench 2.4.1,`silesia.tar`。速度单位 MB/s;体积为输入的百分比。
**AMD EPYC 7B13**(x86_64)AMD EPYC 7B13(Zen 3),GCP C2D,GCC 14.4,`-march=native`。单线程,lzbench 2.4.1,`silesia.tar`。速度单位 MB/s;体积为输入的百分比。
## 下载 ZXC
Linux、macOS 和 Windows 的源码和二进制归档发布在[发布页面](https://github.com/hellobertrand/zxc/releases)。每个归档都带有 SLSA 构建来源证明,可以用以下命令验证:
```bash
gh attestation verify zxc-0.15.0-linux-x86_64.tar.gz --repo hellobertrand/zxc
```
ZXC 也被发行版和包管理器打包:
**Debian 和 Ubuntu**
```bash
sudo apt install zxc libzxc-dev
```
**Homebrew**
```bash
brew install zxc
```
**vcpkg**
```bash
vcpkg install zxc
```
**Conan**
```bash
conan install -r conancenter --requires="zxc/[*]" --build=missing
```
**Winget**
```bash
winget install hellobertrand.zxc
```
各发行版当前打包的版本由 [Repology](https://repology.org/project/zxc/versions) 追踪:
ZXC 在各发行版和包管理器中的打包状态,来自 Repology。(https://repology.org/project/zxc/versions)
从源码构建需要 CMake 3.14 或更高版本和 C17 编译器(GCC、Clang 或 MSVC):
```bash
git clone https://github.com/hellobertrand/zxc.git
cd zxc
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --parallel
sudo cmake --install build
```
安装后提供 CMake 集成(`find_package(zxc)`,目标 `zxc::zxc_lib`)和 pkg-config 文件(`libzxc`)。Meson 用户可以将 ZXC 作为子项目引入;参见[集成指南](https://libzxc.org/docs/install/)。
## 快速开始
`zxc` 命令可以读写文件或管道,也可以作为 `tar` 的压缩器:
```bash
# 压缩(默认级别 3),然后解压
zxc -5 assets.tar assets.tar.zxc
zxc -d assets.tar.zxc assets.tar
# 可寻址归档,用于随机访问
zxc -S big.bin big.bin.zxc
# 作为 tar 的压缩器
tar -I 'zxc -5' -cf data.tar.zxc data/
# 在你的机器上测量速度
zxc -b input_file
```
在 C 中,缓冲区接口各只需一次调用即可压缩和解压:
```c
#include "zxc.h"
uint64_t bound = zxc_compress_bound(src_size);
zxc_compress_opts_t c = {
.level = ZXC_LEVEL_DEFAULT,
.checksum_enabled = 1,
};
int64_t csize = zxc_compress(src, src_size, dst, bound, &c);
zxc_decompress_opts_t d = { .checksum_enabled = 1 };
int64_t n = zxc_decompress(dst, csize, out, out_cap, &d);
if (n < 0)
fprintf(stderr, "zxc: %s\n", zxc_error_name((int)n));
```
流式处理、上下文、可寻址和字典接口请参阅[示例](https://libzxc.org/docs/examples/),所有函数请参阅 [API 参考](https://libzxc.org/docs/api/),所有命令行选项请参阅[手册页](https://libzxc.org/docs/cli/)。
## 语言绑定
官方绑定在主仓库中维护,与库一同发布。它们以 `zxc-compress` 名义发布,因为 `zxc` 这个名称在某些注册表中已被占用。
由社区维护的绑定:[go-zxc](https://github.com/meysam81/go-zxc)(Go)、[zxc-nim](https://github.com/openpeeps/zxc-nim)(Nim),以及一个 [Free Pascal 移植版](https://github.com/Xelitan/Free-Pascal-port-of-ZXC-compressor-decompressor)。
## 测试
- 被 Google [OSS-Fuzz](https://github.com/google/oss-fuzz) 全天候模糊测试,共八个测试用例,覆盖压缩、解压、块 API、就地解码、流式处理、可寻址归档和字典;覆盖率超过库代码行的 80%([覆盖率历史](https://introspector.oss-fuzz.com/project-profile?project=zxc))。
- 相同的测试用例在每次 Pull Request 时通过 ClusterFuzzLite 运行。
- 持续集成中使用 AddressSanitizer、UndefinedBehaviorSanitizer 和 Valgrind;每次变更运行 Cppcheck、Clang 静态分析器和 CodeQL;通过 Snyk 对代码及其依赖进行持续安全分析。
- 解码器一致性测试向量和编码器输出的字节级精确测试,确保线上格式不会意外变更。
- 在多种操作系统、编译器和八种处理器架构上构建和测试。
- CI 依赖已锁定版本,由 [OpenSSF Scorecard](https://scorecard.dev/viewer/?uri=github.com/hellobertrand/zxc) 追踪。
## 获取帮助与贡献
欢迎在 [GitHub Discussions](https://github.com/hellobertrand/zxc/discussions) 提出问题和想法。请在[问题追踪器](https://github.com/hellobertrand/zxc/issues)报告 bug,安全问题请按照[安全策略](https://github.com/hellobertrand/zxc/security/policy)私下报告。
欢迎贡献;请先阅读[贡献指南](https://github.com/hellobertrand/zxc/blob/main/.github/CONTRIBUTING.md)。你也可以通过 [GitHub Sponsors](https://github.com/sponsors/hellobertrand) 支持本项目。
相似文章
OpenZL
OpenZL 是一个压缩库,能够为特定数据格式生成专门的压缩器,以高速实现高压缩比,适用于数据中心工作负载,如 AI 处理。
Show HN: misa77 - 一种比 LZ4 解码快 2 倍的编解码器(且压缩率更高)
misa77 是一种基于 LZ 的新型编解码器,其解压吞吐量比 LZ4 快达 2 倍,同时还能提供更好的压缩比。它适用于一次写入多次读取的工作负载,并且内存占用恒定。
@wangxiaoxin88:电子书爱好者注意了:有一款名为 zlib 的开源工具,可以把 Z-Library 直接塞进命令行……
介绍了一款名为 zlib 的开源命令行工具,可直接在终端中搜索、下载 Z-Library 电子书,支持 Kindle 推送、代理及自定义域名,并已集成 Claude Code 和 Codex 等 AI Agent。
Taco:跨平台 LLM 压缩,更换 GPU 或 CPU 也不会出错。[P]
Taco 提出一种跨平台 LLM 压缩方法,通过纯整数推理、精确的 float32 到整数转换与一致性测试向量,确保编码端与解码端在不同 GPU/CPU 硬件上产生完全相同的输出,并在 7 个后端上验证了哈希一致。
Fc:一种针对浮点数流的无损压缩器
fc 是一款开源的 IEEE-754 64 位双精度浮点数流无损压缩器,对于结构化数据,其压缩率优于 zstd 和 fpzip,但编码速度较慢。