2026 年 10 月 22 日

近期,一篇题为《为什么 Lean 比 aster 更快》的文章引发关注。作者披露了一项显著成果:基于 Lean 4(一种兼具函数式编程与定理证明助手特性的语言)开发的 DEFLATE 压缩库,其性能超越了 Rust 生态中下载量超 10 亿次的同类包 miniz_oxide。文章核心结论指出:“我不相信你,但我相信数据。”
该实现超越了 miniz_oxide 的所有压缩级别,即在提供相同压缩率的同时实现了更高吞吐量。在最快设置下,速度提升 15%,输出体积缩小 8.8%。
不过,原文也明确界定了性能边界:尽管优于 miniz_oxide,lean-zip 并非最优解。作为对比基准的 libdeflate——一个经过极致调优、利用特定架构 SIMD 指令集(Lean 无法直接调用)的实现——在性能上仍具有压倒性优势。
在此背景下,Roc 语言进入视野。作为一种专注于运行时性能的纯函数式编程语言(非定理验证器),Roc 以“快速、友好、功能”为标语,将运行速度与编译速度置于核心目标。尽管 Roc 尚未发布正式版(距离 0.1.0 版本尚有几周时间),且其包生态系统仍处于早期阶段,但其基础性能足以挑战当前冠军 libdeflate。
针对 Niclas Ahden 编写的 Roc 版 DEFLATE 压缩包 roc-deflate,开发者进行了大量性能优化工作。测试并未追求全面超越 libdeflate,而是聚焦于非流式 API 场景(roc-deflate 暂未支持流式处理),使用经典的 Silesian corpus 进行基准测试,并严格验证输出结果的一致性。
性能差距控制在 10% 以内
测试环境涵盖两台设备:2021 款 M1 MacBook Pro 以及搭载 AMD Ryzen 9 3900X 处理器的 Ubuntu x64 机器。
在 144 项基准测试中,roc-deflate 的平均性能略低于 libdeflate。具体数据显示,在 Ryzen 3900X 平台上,中位数性能差距为 8.9%;而在 M1 MacBook Pro 平台上,这一差距缩小至 2.6%。
dickens: 230.57 MB/s (15 次运行中位数)
mozilla: 248.31 MB/s (15 次运行中位数)
mr: 312.26 MB/s (15 次运行中位数)
nci: 601.03 MB/s (15 次运行中位数)
ooffice: 169.98 MB/s (15 次运行中位数)
osdb: 284.01 MB/s (15 次运行中位数)
reymont: 281.14 MB/s (15 次运行中位数)
samba: 344.00 MB/s (15 次运行中位数)
sao: 160.21 MB/s (15 次运行中位数)
webster: 268.58 MB/s (15 次运行中位数)
x-ray: 145.93 MB/s (15 次运行中位数)
xml: 476.83 MB/s (15 次运行中位数)
roc-deflate at L1 compressiondickens: 202.92 MB/s (15 次运行中位数)
mozilla: 225.79 MB/s (15 次运行中位数)
mr: 277.57 MB/s (15 次运行中位数)
nci: 529.49 MB/s (15 次运行中位数)
ooffice: 153.99 MB/s (15 次运行中位数)
osdb: 257.14 MB/s (15 次运行中位数)
reymont: 245.80 MB/s (15 次运行中位数)
samba: 309.79 MB/s (15 次运行中位数)
sao: 145.28 MB/s (15 次运行中位数)
webster: 239.18 MB/s (15 次运行中位数)
x-ray: 134.66 MB/s (15 次运行中位数)
xml: 419.07 MB/s (15 次运行中位数)
libdeflate at L2 compressiondickens: 161.68 MB/s (median across 15 runs)
mozilla: 184.55 MB/s (median across 15 runs)
mr: 204.86 MB/s (median across 15 runs)
nci: 453.14 MB/s (median across 15 runs)
ooffice: 128.05 MB/s (median across 15 runs)
osdb: 203.10 MB/s (median across 15 runs)
reymont: 207.66 MB/s (median across 15 runs)
samba: 249.57 MB/s (median across 15 runs)
sao: 112.78 MB/s (median across 15 runs)
webster: 198.86 MB/s (median across 15 runs)
x-ray: 117.18 MB/s (median across 15 runs)
xml: 352.59 MB/s (median across 15 runs)
roc-deflate at L2 compressiondickens: 143.60 MB/s (median across 15 runs)
mozilla: 168.37 MB/s (median across 15 runs)
mr: 182.07 MB/s (median across 15 runs)
nci: 409.82 MB/s (median across 15 runs)
ooffice: 118.08 MB/s (median across 15 runs)
osdb: 185.41 MB/s (median across 15 runs)
reymont: 183.69 MB/s (median across 15 runs)
samba: 228.02 MB/s (median across 15 runs)
sao: 105.68 MB/s (median across 15 runs)
webster: 181.07 MB/s (median across 15 runs)
x-ray: 107.00 MB/s (median across 15 runs)
xml: 323.17 MB/s (median across 15 runs)
libdeflate at L3 compressiondickens: 130.85 MB/s (median across 15 runs)
mozilla: 169.26 MB/s (median across 15 runs)
mr: 171.11 MB/s (median across 15 runs)
nci: 415.29 MB/s (median across 15 runs)
ooffice: 118.92 MB/s (median across 15 runs)
osdb: 183.10 MB/s (median across 15 runs)
reymont: 169.42 MB/s (median across 15 runs)
samba: 223.27 MB/s (median across 15 runs)
sao: 100.60 MB/s (median across 15 runs)
webster: 173.36 MB/s (median across 15 runs)
x-ray: 116.62 MB/s (median across 15 runs)
xml: 324.65 MB/s (median across 15 runs)
roc-deflate at L3 compressiondickens: 122.04 MB/s (median across 15 runs)
mozilla: 158.29 MB/s (median across 15 runs)
mr: 159.07 MB/s (median across 15 runs)
nci: 382.21 MB/s (median across 15 runs)
ooffice: 111.14 MB/s (median across 15 runs)
osdb: 171.27 MB/s (median across 15 runs)
reymont: 157.19 MB/s (median across 15 runs)
samba: 209.86 MB/s (median across 15 runs)
sao: 95.51 MB/s (median across 15 runs)
webster: 162.75 MB/s (median across 15 runs)
x-ray: 105.93 MB/s (median across 15 runs)
xml: 300.31 MB/s (median across 15 runs)
libdeflate at L4 compressiondickens: 119.94 MB/s (median across 15 runs)
mozilla: 158.07 MB/s (median across 15 runs)
mr: 156.88 MB/s (median across 15 runs)
nci: 376.70 MB/s (median across 15 runs)
ooffice: 113.68 MB/s (median across 15 runs)
osdb: 164.59 MB/s (median across 15 runs)
reymont: 152.16 MB/s (median across 15 runs)
samba: 207.97 MB/s (median across 15 runs)
sao: 94.48 MB/s (median across 15 runs)
webster: 158.64 MB/s (median across 15 runs)
x-ray: 116.63 MB/s (median across 15 runs)
xml: 294.31 MB/s (median across 15 runs)
roc-deflate at L4 compressiondickens: 113.71 MB/s (median across 15 runs)
mozilla: 148.77 MB/s (median across 15 runs)
mr: 149.00 MB/s (median across 15 runs)
nci: 356.47 MB/s (median across 15 runs)
ooffice: 107.59 MB/s (median across 15 runs)
osdb: 156.41 MB/s (median across 15 runs)
reymont: 142.45 MB/s (median across 15 runs)
samba: 197.17 MB/s (median across 15 runs)
sao: 89.37 MB/s (median across 15 runs)
webster: 151.15 MB/s (median across 15 runs)
x-ray: 106.32 MB/s (median across 15 runs)
xml: 278.53 MB/s (median across 15 runs)
libdeflate at L5 compressiondickens: 95.14 MB/s (median across 15 runs)
mozilla: 133.06 MB/s (median across 15 runs)
mr: 129.45 MB/s (median across 15 runs)
nci: 287.09 MB/s (median across 15 runs)
ooffice: 95.87 MB/s (median across 15 runs)
osdb: 140.08 MB/s (median across 15 runs)
reymont: 120.63 MB/s (median across 15 runs)
samba: 170.75 MB/s (median across 15 runs)
sao: 83.22 MB/s (median across 15 runs)
webster: 125.60 MB/s (median across 15 runs)
x-ray: 102.48 MB/s (median across 15 runs)
xml: 229.70 MB/s (median across ...)





