Show HN: misa77 - 一种比 LZ4 解码快 2 倍的编解码器(且压缩率更高)
摘要
misa77 是一种基于 LZ 的新型编解码器,其解压吞吐量比 LZ4 快达 2 倍,同时还能提供更好的压缩比。它适用于一次写入多次读取的工作负载,并且内存占用恒定。
查看缓存全文
缓存时间: 2026/07/15 16:43
欢迎来到阳光明媚之处/misa77
来源:https://github.com/welcome-to-the-sunny-side/misa77
misa77 (0.2.0)
misa77 是一款基于 LZ 的编解码器,专为“一次写入、多次读取”场景设计。具体而言,它旨在满足以下标准:
- 极高的解压吞吐量(单线程)。
- 适中的压缩比(它没有熵编码后端,因此显然无法与 zstd 等相比,但高努力等级的 LZ4 是一个很好的参考点)。
- 内存使用恒定,与输入大小无关(所有压缩模式 ≤ 5 MB,解压时为 0 MB)。
压缩速度慢是实现上述目标所做出的明显权衡。
此外,misa77 有一种略微协同的趋势:解压高度压缩的文件速度更快,从而产生以下结果:
- 在高度可压缩的文件上,它提供特别高的解压吞吐量。
- 即便是中等可压缩的文件,在压缩时投入更多努力以获得更压缩的结果,也能带来更好的解压吞吐量(除了更好的压缩比这一自然优势外)。
这使得高努力压缩模式对 misa77 特别有吸引力,并催生了一些实验性压缩模式(请参阅 src/experimental/),这些模式旨在压缩时投入更多努力,以产生对大多数 CPU 微架构更友好的压缩流。
misa77 在 v0.2.0 中还提供了两个压缩努力等级:
- 等级 0:提供更好的解码吞吐量,压缩比稍差,编码吞吐量相似
- 等级 1(默认):提供稍差的解码吞吐量,更高的压缩比,编码吞吐量相似
文档
库函数使用的底层流格式以及 CLI 生成的 .misa77 文件的容器格式可以在 docs/ 中找到。
基准测试
详细结果如下,但简要总结如下:
- 在大多数数据形状上,misa77 的解压吞吐量与压缩比的帕累托前沿上表现优异。
- 即使竞争对手的压缩比明显更差,它解压速度也经常更快。
- 它的压缩速度相当慢。
v0.1.0 的跨平台结果(Intel x86-64、AMD x86-64、ARM64)可以在 此处 找到。请注意,这些结果可能在你阅读时已过时。
以下是 Intel x86-64 的一些详细结果。
设置:
- CPU:Intel(R) Core(TM) i7-14650HX(@2.2 GHz)(禁用 Intel Turbo)。
- 单线程,固定到单个性能核心。
- CPU 调速器设置为
performance。 - 基准测试工具是 lzbench 的一个公共分支,可在此处访问(https://github.com/welcome-to-the-sunny-side/lzbench)。
Silesia 语料库结果(https://sun.aei.polsl.pl//~sdeor/corpus/silesia.zip)。
首先列出 misa77 行,然后竞争对手按解压速度排序。
| 压缩器名称 | 压缩速度 | 解压速度 | 压缩比 | 文件名 |
|---|---|---|---|---|
| misa77 0.2.0 -0 | 54.5 MB/s | 5219 MB/s | 42.64 | silesia.tar |
| misa77 0.2.0 -1 | 51.2 MB/s | 4274 MB/s | 39.65 | silesia.tar |
| zxc 0.12.0 -3 | 115 MB/s | 2841 MB/s | 45.46 | silesia.tar |
| zxc 0.12.0 -4 | 80.8 MB/s | 2726 MB/s | 42.63 | silesia.tar |
| lzsse8fast 2019-04-18 | 183 MB/s | 2661 MB/s | 44.80 | silesia.tar |
| zxc 0.12.0 -5 | 48.6 MB/s | 2599 MB/s | 40.25 | silesia.tar |
| lz4hc 1.10.0 -12 | 7.31 MB/s | 2531 MB/s | 36.45 | silesia.tar |
| lzsse4fast 2019-04-18 | 186 MB/s | 2522 MB/s | 45.26 | silesia.tar |
| lz4 1.10.0 | 371 MB/s | 2505 MB/s | 47.59 | silesia.tar |
| lizard 2.1 -10 | 320 MB/s | 2452 MB/s | 48.79 | silesia.tar |
| zstd 1.5.7 -1 | 297 MB/s | 901 MB/s | 34.54 | silesia.tar |
| snappy 1.2.2 | 375 MB/s | 855 MB/s | 47.89 | silesia.tar |
enwik8 结果(https://mattmahoney.net/dc/textdata.html)。
| 压缩器名称 | 压缩速度 | 解压速度 | 压缩比 | 文件名 |
|---|---|---|---|---|
| misa77 0.2.0 -0 | 38.7 MB/s | 4802 MB/s | 48.59 | enwik8 |
| misa77 0.2.0 -1 | 40.6 MB/s | 4134 MB/s | 44.05 | enwik8 |
| zxc 0.12.0 -3 | 70.1 MB/s | 2674 MB/s | 52.05 | enwik8 |
| zxc 0.12.0 -5 | 38.7 MB/s | 2627 MB/s | 46.85 | enwik8 |
| zxc 0.12.0 -4 | 52.7 MB/s | 2593 MB/s | 48.60 | enwik8 |
| lzsse4fast 2019-04-18 | 141 MB/s | 2581 MB/s | 47.11 | enwik8 |
| lzsse8fast 2019-04-18 | 135 MB/s | 2553 MB/s | 47.25 | enwik8 |
| lizard 2.1 -10 | 240 MB/s | 2462 MB/s | 57.31 | enwik8 |
| lz4 1.10.0 | 276 MB/s | 2355 MB/s | 57.26 | enwik8 |
| lz4hc 1.10.0 -12 | 9.89 MB/s | 2167 MB/s | 41.91 | enwik8 |
| zstd 1.5.7 -1 | 225 MB/s | 831 MB/s | 40.66 | enwik8 |
| snappy 1.2.2 | 240 MB/s | 568 MB/s | 55.93 | enwik8 |
由于 misa77 的性能相当“尖峰”(取决于被压缩数据的形状),对 Silesia 语料库进行逐文件分解可以揭示其性能的一些有趣见解。
注意:
- 接下来的可视化数据来自 misc/lzbench-results-archive/0.2.0/intel.txt 中的基准测试结果
- 这些结果与之前提到的 x86-64 (Intel) 设置相同。
相对于 LZ4 的解码速度
在等级 0 下,misa77 在所有 12 个文件上的解码速度都快于 LZ4(其中一些文件差距巨大)。所有其他等级在 11/12 个文件上解码更快。例外的是 x-ray,它高度不可压缩(LZ4 在该文件上的压缩比接近 1.0,实际上退化为 memcpy)。
misa77 四种模式每个文件相对于 LZ4 的解码速度,Silesia(Intel)
吞吐量与压缩比,与流行的快速解码编解码器对比
在可压缩文件上,misa77 位于解码吞吐量/压缩比的帕累托前沿:它解码最快,同时大致匹配或超越其他快速 LZ 编解码器的压缩比。sao 和 x-ray 由于前面所述的原因例外。
misa77 与其他编解码器的逐文件解码吞吐量与压缩比对比,Silesia(Intel)
要求
- 支持 C++20 的编译器(GCC 和 Clang 均可)。
- CMake >= 3.20。
- 小端 64 位系统。
misaCLI 需要 POSIX(Linux、macOS)。
注意:在 x86-64 上,AVX2/SSE2 在运行时选择。其他架构使用可移植路径,该路径没有显式的内建函数,但编译器很容易自动向量化(根据我的测试,至少在 Apple ARM 上它会自动向量化)。
构建
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build
这将生成位于 build/misa 的 misa CLI。如需针对运行它的具体机器进行调优,请添加 -DMISA77_MARCH=native(我推荐这样做)。要运行往返测试:
ctest --test-dir build
CLI 用法
misa 是一个独立的无依赖二进制文件,具有三个基于文件的子命令。它仅对单个文件操作(不支持目录或管道,如果需要请先使用 tar)。
misa compress FILE # -> FILE.misa77
misa decompress FILE.misa77 # -> FILE
misa suggest FILE # -> FILE.misap (调优参数)
misa compress 使用 -l N / --level N 选择压缩等级(默认为 1)。
还有一些实验性压缩模式(一次最多使用一个,不能与 --level 组合使用):
| 标志 | 效果 |
|---|---|
--adaptive | 根据输入自动调优压缩器以优化解码速度(仅用于同类数据) |
--params F.misap | 使用 misa suggest 生成的向量进行压缩 |
--yolo | 高努力、解码优化模式 |
--adaptive 和 suggest 还接受 --tune loose / --tune tight(类似于 level 0/1 的权衡,默认为 loose)和 --sample MB(选择参数时采样的输入量,默认为 2 MB)。所有子命令中,-o PATH 设置输出路径,-f 直接覆盖而不询问。
misa compress -l 0 enwik8 # enwik8 -> enwik8.misa77,最快解码等级
misa decompress enwik8.misa77 # 还原为 enwik8
# 对样本进行调优,然后重用参数:
misa suggest --tune tight data.bin # -> data.misap
misa compress --params data.misap data.bin
状态
- misa77 的格式可能会意外更改,因为它仍处于 v0.x.y 阶段。
- 解码器假设输入是有效的 misa77 流。无效输入是未定义行为,我不对 misa77 在此情况下的任何行为提供保证。
- 它已经过一些本地模糊测试,但并未加固,因此请将其视为实验性软件。
注意:misa77 是从一个不太成熟的学习性能工程的尝试演变而来,其历史可以在位于此处的存档仓库中找到(https://github.com/welcome-to-the-sunny-side/misa77-archive)。
致谢
灵感来源于:
- LZ4 (http://github.com/lz4/lz4/)
- zxc (https://github.com/hellobertrand/zxc)
- lizard (https://github.com/inikep/lizard)
最后,Claude Opus 4.8 和 Fable 5 在脚本编写、工具开发和 CLI 构建方面提供了很大帮助。
许可证
MIT(参见 LICENSE)。
相似文章
mistral.rs v0.9.0:在x86和ARM上CPU解码速度比llama.cpp快达1.8倍!
mistral.rs v0.9.0 在x86和ARM上实现了比llama.cpp快达1.8倍的CPU解码速度,优化覆盖所有CPU规格,并保证基准测试完全可重现。
OpenZL
OpenZL 是一个压缩库,能够为特定数据格式生成专门的压缩器,以高速实现高压缩比,适用于数据中心工作负载,如 AI 处理。
AdaCodec:面向视频多模态大模型的预测性视觉编码
AdaCodec 通过仅在场景预测失败时传输完整视觉标记,否则使用紧凑的帧间变化描述,从而减少多模态大模型中的视频编码冗余。在匹配的标记预算下,它优于逐帧 RGB 基线,并且在使用显著更少标记的情况下取得更好或相当的结果,将首令牌延迟从 9.26 秒降至 1.62 秒。
LiteFrame 扩展视频大语言模型效率(6分钟阅读)
LiteFrame 为视频大语言模型引入了一种高效的视频编码器,采用压缩令牌蒸馏技术,在保持准确率的同时,能够处理多达8倍的帧数并降低35%的延迟,为长视频理解开创了新的帕累托前沿。
@lateinteraction: 这显然是一个64倍压缩比,且质量几乎无损失——@yjoonjang 的作品真的很好!
一条推文强调实现了64倍压缩比,且质量几乎无损失,赞扬了 @yjoonjang 的工作。