后端 QRCode 包 PK 基准测试
测试概述
本页记录 Rust 三方实现的端到端 SVG 性能对比,数据来源 benchmark_speedup_verified.json。
⚠️ 历史说明:本页此前给出的是一张 Node / Bun / Rust / kennytm 五方混合排行榜 (
qrcode-fast54,283 ops/s 等)。那批数字来自一个「生成伪数据、仅用于性能测试」的构建, 产物并非真实二维码,且 kennytm 基线无法复现,现已全部撤回。本页也曾用
backend_benchmark_pk.json呈现 Node.js 与 Bun 的对比。该对比存在混淆变量:@veaba/qrcode-node与@veaba/qrcode-bun是两套不同的实现,因此同时变动了「运行时」与 「实现」两个因素,无法归因;且仓库内另有两份独立抽样得出相反结论(Bun 领先)。 为避免误导,该对比及其数据文件已一并删除。
测试方法
测试环境
- 平台: Windows x64
- Rust: rustc 1.89.0,release (opt-level 3)
- 采样: 每用例预热 20 次 + 100 次取平均
- 正确性: resvg 渲染 + rqrr 独立解码
测试指标
- µs: 端到端 SVG 生成平均耗时(越低越好)
- 倍率: 相对于
kennytm-qrcode的速度提升
主要发现
🏆 Rust 端到端 SVG 生成
三方实现在同一进程内依次测量,每个用例预热 20 次后重复 100 次取平均,单位为微秒(越低越好)。
复现:cd bench/rust-tools && cargo run --release --bin verify-speedup
同一份数据折算吞吐量(由 µs 经
1e6 / µs换算,仅作参考):Simple 用例下 fast ≈ 54,054 ops/s、rust ≈ 31,153 ops/s、kennytm ≈ 4,753 ops/s。 这不是一张跨运行时排行榜 —— 上表只包含 Rust 实现。
注意:上表的数值由 benchmark_speedup_verified.json 的 methodology.correctness_check 约束 —— 每个用例的产物都必须能被 resvg 渲染 + rqrr 独立解码还原为原始文本,因此性能数字对应的确实是可用的二维码。
历史提示:2026-03-20 之前,
qrcode-fast在约 119 字节以上、qrcode-rust在约 56 字节以上会生成无法解码的二维码。该缺陷已修复,两个包现均覆盖 Version 1-40,H 级最大可解码长度 1273 字节(QR 标准上限)。详见benchmark_speedup_verified.json的capability与fixed_defects。 复现:cargo run --release --features validation --bin scan-max --manifest-path bench/rust-tools/Cargo.toml
对比总结
以下三行是当前唯一能够复现的跨实现倍率,全部来自 benchmark_speedup_verified.json:
与其他运行时的关系
不提供 qrcode-fast / qrcode-rust 与 Node.js / Bun 实现之间的倍率。
不同运行时的数据出自不同的测量程序与不同的机器,相除得到的倍数没有意义。
SVG 验证
使用 bench/rust-tools 验证工具对生成的 SVG 进行验证:
验证结果 (文本: "Hello World"):
以下数字与上方基准不同:它们来自 bench/rust-tools 验证工具的单次输出(含 SVG 序列化与文件写入),
不是 100 次取平均的基准结果,请勿与 benchmark_speedup_verified.json 的 18.5 / 32.1 / 210.4 µs 直接比较。
- ✅
@veaba/qrcode-rust- 147.1µs, 13,798 bytes - ✅
@veaba/qrcode-fast- 48.6µs, 4,187 bytes - ✅
kennytm-qrcode- 291.4µs, 4,270 bytes (社区库基准)
所有生成的 SVG 均可通过标准二维码扫描器正确解码。
注:文件字节数与
benchmark_svg_rust.json一致(4,187 / 13,798 / 4,270),但该 JSON 中的平均耗时是 10 / 26 / 222 µs, 与上面的单次测量不同 —— 两者口径不同(前者为 SVG-only harness 的多次平均,后者为单次跑批),不可混用。
运行基准测试
结果文件
使用建议
✅ 文本长度不再有已知的可解码上限问题:
qrcode-rust与qrcode-fast均覆盖 Version 1-40, 在纠错级别 H 下最大可解码长度 1273 字节(QR 标准上限),且每个用例的产物都经 resvg + rqrr 独立解码验证。 早期版本在约 56 / 119 字节以上不可解码的缺陷已修复,详见benchmark_speedup_verified.json的capability与fixed_defects。
最后更新: 2026-03-20(撤回伪数据时代的混合排行榜;删除 Node.js / Bun 对比——该对比同时变动运行时与实现两个变量,无法归因)