ZXC:为超快速解压而生的无损压缩

Lobsters Hottest 工具

摘要

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

Lobsters Hottest

OpenZL 是一个压缩库,能够为特定数据格式生成专门的压缩器,以高速实现高压缩比,适用于数据中心工作负载,如 AI 处理。

Taco:跨平台 LLM 压缩,更换 GPU 或 CPU 也不会出错。[P]

Reddit r/MachineLearning

Taco 提出一种跨平台 LLM 压缩方法,通过纯整数推理、精确的 float32 到整数转换与一致性测试向量,确保编码端与解码端在不同 GPU/CPU 硬件上产生完全相同的输出,并在 7 个后端上验证了哈希一致。