Hacker News 中文摘要

RSS订阅

Show HN: misa77 - 比LZ4解码快2倍(且压缩比更高)的编解码器 -- Show HN: misa77 - a codec that decodes 2x faster than LZ4 (at better ratios)

文章摘要

misa77是一款基于LZ算法的编解码器,专为一次写入多次读取场景设计。它追求极高的单线程解压吞吐量、适中的压缩比和恒定的内存使用(解压时零内存占用),但压缩速度较慢。该工具对高压缩比文件解压更快,高压缩级别能提升解压性能。

文章总结

好的,这是根据您的要求,对原文进行中文重述和精简后的版本:

misa77 (0.2.0) 简介

misa77 是一款基于 LZ 算法的编解码器,专为“一次写入,多次读取”的场景设计。它追求以下目标:

  • 极高的解压吞吐量(单线程)。
  • 适中的压缩比:由于没有熵编码后端,其压缩比无法与 zstd 等算法相比,但高强度的 LZ4 是一个不错的参考。
  • 恒定的内存使用:无论输入大小如何,压缩时内存占用不超过 5 MB,解压时为 0 MB。
  • 以较慢的压缩速度为代价,换取上述优势。

此外,misa77 的一个特点是,压缩率越高的文件,其解压速度反而越快。这意味着:

  • 对于高可压缩性文件,解压吞吐量尤其高。
  • 对于中等可压缩性文件,在压缩时投入更多精力以获得更好的压缩率,也能提升解压速度。

这使得高强度压缩对 misa77 特别有吸引力,并催生了一些实验性压缩模式,旨在通过更耗时的压缩过程,生成对 CPU 微架构更友好的压缩流。

版本 0.2.0 的压缩级别:

  • 级别 0:解码吞吐量更高,压缩比略差,编码速度与级别 1 相似。
  • 级别 1(默认):解码吞吐量略低,压缩比更好,编码速度与级别 0 相似。

性能基准测试

misa77 在大多数数据类型上,其解压吞吐量与压缩比的组合都处于帕累托最优边界。它经常在解压速度上超越竞争对手,即使对手的压缩比明显更差。其主要的短板是压缩速度较慢。

在 Silesia 语料库上的测试结果(Intel x86-64):

  • misa77 0.2.0 -0:压缩 54.5 MB/s,解压 5219 MB/s,压缩比 42.64
  • misa77 0.2.0 -1:压缩 51.2 MB/s,解压 4274 MB/s,压缩比 39.65
  • zstd 1.5.7 -1:压缩 297 MB/s,解压 901 MB/s,压缩比 34.54
  • lz4 1.10.0:压缩 371 MB/s,解压 2505 MB/s,压缩比 47.59

在 enwik8 上的测试结果(Intel x86-64):

  • misa77 0.2.0 -0:压缩 38.7 MB/s,解压 4802 MB/s,压缩比 48.59
  • misa77 0.2.0 -1:压缩 40.6 MB/s,解压 4134 MB/s,压缩比 44.05
  • zstd 1.5.7 -1:压缩 225 MB/s,解压 831 MB/s,压缩比 40.66
  • lz4 1.10.0:压缩 276 MB/s,解压 2355 MB/s,压缩比 57.26

性能特点:

misa77 的性能表现“波动性”较大,高度依赖数据的特性。在 Silesia 语料库的逐文件分析中,级别 0 在所有 12 个文件上的解压速度都快于 lz4。唯一的例外是高度不可压缩的 x-ray 文件,此时 lz4 的压缩比接近 1.0,其行为退化为简单的内存拷贝。

系统要求与构建

  • 需要 C++20 编译器(GCC 或 Clang)、CMake >= 3.20 以及小端 64 位系统。
  • CLI 工具需要 POSIX 环境(Linux, macOS)。
  • 构建命令:cmake -B build -DCMAKE_BUILD_TYPE=Release 然后 cmake --build build。建议添加 -DMISA77_MARCH=native 参数以针对当前机器进行优化。

库使用

构建后会生成一个静态库,并提供 C++ API。使用时,需通过 misa77::compress_bound()misa77::decompressed_buffer_bound() 来正确分配目标缓冲区大小。当前版本(v0.2.x)的解压器假设输入流是有效的,对无效输入的行为未定义。

CLI 使用

misa 命令支持三个子命令:compressdecompresssuggest。它仅能处理单个文件。压缩级别通过 -l 参数指定(默认为 1)。此外,还有一些实验性压缩模式,如 --adaptive(自动调参)和 --yolo(高强度、解码优化模式)。

状态与许可

misa77 仍处于 v0.x.y 阶段,其格式可能随时变化。解压器未做安全加固,请将其视为实验性软件。该项目基于 MIT 许可协议发布。

评论总结

根据评论内容,总结如下:

主要观点与论据:

  1. 性能优势:多数评论认可misa在解压速度和压缩比上优于LZ4,尤其对高压缩比文件表现突出。

    • 关键引用:
      • "Almost double the decompression speed, and a higher compression ratio than LZ4?" (scottchiefbaker)
      • "It offers particularly high decompression throughput on highly compressible files." (kazinator)
  2. 技术局限:部分评论指出misa对损坏/恶意数据不鲁棒,且解压速度在AArch64上慢于LZ4。

    • 关键引用:
      • "if you are not robust to corrupted/malicious data, it is really in a different class of algorithm" (Sesse__)
      • "It is slower than LZ4 on AArch64." (zX41ZdbW)
  3. 应用场景:评论者关注其适用性,如游戏引擎、启动固件、流媒体等,但缺乏集成文档。

    • 关键引用:
      • "so whats the actual use case for this ? streaming ? games?" (zuzululu)
      • "I don't see much in your README that talks about how a developer would integrate misa into their code." (scottchiefbaker)
  4. 技术原理:有评论解释其加速源于优化memcpy操作,但编码速度较慢,需权衡。

    • 关键引用:
      • "you can streamline and make the format friendlier to do memcpy... the more memcpys you do, the faster it is overall to decode." (danlark1)
      • "But you have to pay the price that you need a slower encoding." (danlark1)
  5. 实验性状态:项目仍为v0.x.y,格式可能变化,且未充分硬化。

    • 关键引用:
      • "misa77's format may change unexpectedly as it's still v0.x.y." (wolf550e)
      • "The decoder assumes that the input is a valid misa77 stream. Invalid input is UB." (wolf550e)

平衡性说明:评论整体对misa的性能提升持积极态度,但强调其鲁棒性不足、平台差异及实验性风险。部分评论(如danlark1)从技术角度解释了设计权衡,而其他评论(如purple-leafy)则分享了个人压缩经验作为背景。