Show HN: misa77 - 一种比 LZ4 解码快 2 倍的编解码器(且压缩率更高)

Hacker News Top 工具

摘要

misa77 是一种基于 LZ 的新型编解码器,其解压吞吐量比 LZ4 快达 2 倍,同时还能提供更好的压缩比。它适用于一次写入多次读取的工作负载,并且内存占用恒定。

过去几个月,我一直在开发这个编解码器。<p>它具有以下特点:<p><pre><code> - SOTA decompression throughput in its ratio class - Decent ratios (comparable to LZ4 at high effort levels) - Slow compression </code></pre> 大多数性能提升归功于通过智能格式减少分支,并使解压过程对乱序执行核心非常友好。<p>以下是在 Intel x86-64 上对 tar 打包的 Silesia 语料库的测试结果:<p><pre><code> codec decode ratio encode misa77 -0 5219 MB/s 42.64% 54.5 MB/s misa77 -1 4274 MB/s 39.65% 51.2 MB/s lz4 2505 MB/s 47.59% 371 MB/s lz4hc -12 2531 MB/s 36.45% 7.31 MB/s</code></pre>
查看原文
查看缓存全文

缓存时间: 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 -054.5 MB/s5219 MB/s42.64silesia.tar
misa77 0.2.0 -151.2 MB/s4274 MB/s39.65silesia.tar
zxc 0.12.0 -3115 MB/s2841 MB/s45.46silesia.tar
zxc 0.12.0 -480.8 MB/s2726 MB/s42.63silesia.tar
lzsse8fast 2019-04-18183 MB/s2661 MB/s44.80silesia.tar
zxc 0.12.0 -548.6 MB/s2599 MB/s40.25silesia.tar
lz4hc 1.10.0 -127.31 MB/s2531 MB/s36.45silesia.tar
lzsse4fast 2019-04-18186 MB/s2522 MB/s45.26silesia.tar
lz4 1.10.0371 MB/s2505 MB/s47.59silesia.tar
lizard 2.1 -10320 MB/s2452 MB/s48.79silesia.tar
zstd 1.5.7 -1297 MB/s901 MB/s34.54silesia.tar
snappy 1.2.2375 MB/s855 MB/s47.89silesia.tar

enwik8 结果(https://mattmahoney.net/dc/textdata.html)。

压缩器名称压缩速度解压速度压缩比文件名
misa77 0.2.0 -038.7 MB/s4802 MB/s48.59enwik8
misa77 0.2.0 -140.6 MB/s4134 MB/s44.05enwik8
zxc 0.12.0 -370.1 MB/s2674 MB/s52.05enwik8
zxc 0.12.0 -538.7 MB/s2627 MB/s46.85enwik8
zxc 0.12.0 -452.7 MB/s2593 MB/s48.60enwik8
lzsse4fast 2019-04-18141 MB/s2581 MB/s47.11enwik8
lzsse8fast 2019-04-18135 MB/s2553 MB/s47.25enwik8
lizard 2.1 -10240 MB/s2462 MB/s57.31enwik8
lz4 1.10.0276 MB/s2355 MB/s57.26enwik8
lz4hc 1.10.0 -129.89 MB/s2167 MB/s41.91enwik8
zstd 1.5.7 -1225 MB/s831 MB/s40.66enwik8
snappy 1.2.2240 MB/s568 MB/s55.93enwik8

由于 misa77 的性能相当“尖峰”(取决于被压缩数据的形状),对 Silesia 语料库进行逐文件分解可以揭示其性能的一些有趣见解。

注意:

相对于 LZ4 的解码速度

在等级 0 下,misa77 在所有 12 个文件上的解码速度都快于 LZ4(其中一些文件差距巨大)。所有其他等级在 11/12 个文件上解码更快。例外的是 x-ray,它高度不可压缩(LZ4 在该文件上的压缩比接近 1.0,实际上退化为 memcpy)。

misa77 四种模式每个文件相对于 LZ4 的解码速度,Silesia(Intel)

吞吐量与压缩比,与流行的快速解码编解码器对比

在可压缩文件上,misa77 位于解码吞吐量/压缩比的帕累托前沿:它解码最快,同时大致匹配或超越其他快速 LZ 编解码器的压缩比。saox-ray 由于前面所述的原因例外。

misa77 与其他编解码器的逐文件解码吞吐量与压缩比对比,Silesia(Intel)

要求

  • 支持 C++20 的编译器(GCC 和 Clang 均可)。
  • CMake >= 3.20。
  • 小端 64 位系统。
  • misa CLI 需要 POSIX(Linux、macOS)。

注意:在 x86-64 上,AVX2/SSE2 在运行时选择。其他架构使用可移植路径,该路径没有显式的内建函数,但编译器很容易自动向量化(根据我的测试,至少在 Apple ARM 上它会自动向量化)。

构建

cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build

这将生成位于 build/misamisa 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高努力、解码优化模式

--adaptivesuggest 还接受 --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

状态

  1. misa77 的格式可能会意外更改,因为它仍处于 v0.x.y 阶段。
  2. 解码器假设输入是有效的 misa77 流。无效输入是未定义行为,我不对 misa77 在此情况下的任何行为提供保证。
  3. 它已经过一些本地模糊测试,但并未加固,因此请将其视为实验性软件。

注意: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)。

相似文章

OpenZL

Lobsters Hottest

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

AdaCodec:面向视频多模态大模型的预测性视觉编码

Hugging Face Daily Papers

AdaCodec 通过仅在场景预测失败时传输完整视觉标记,否则使用紧凑的帧间变化描述,从而减少多模态大模型中的视频编码冗余。在匹配的标记预算下,它优于逐帧 RGB 基线,并且在使用显著更少标记的情况下取得更好或相当的结果,将首令牌延迟从 9.26 秒降至 1.62 秒。

LiteFrame 扩展视频大语言模型效率(6分钟阅读)

TLDR AI

LiteFrame 为视频大语言模型引入了一种高效的视频编码器,采用压缩令牌蒸馏技术,在保持准确率的同时,能够处理多达8倍的帧数并降低35%的延迟,为长视频理解开创了新的帕累托前沿。