后端 QRCode 包 PK 基准测试

测试概述

本页记录 Rust 三方实现的端到端 SVG 性能对比,数据来源 benchmark_speedup_verified.json。

包运行时描述
@veaba/qrcode-rustRustRust 原生 QRCode 实现
@veaba/qrcode-fastRustRust 优化版 QRCode
kennytm-qrcodeRust社区流行的 Rust QRCode 库

⚠️ 历史说明:本页此前给出的是一张 Node / Bun / Rust / kennytm 五方混合排行榜 (qrcode-fast 54,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

用例文本长度@veaba/qrcode-fast@veaba/qrcode-rustkennytm-qrcodefast vs kennytmrust vs kennytmfast vs rust
Simple (Hello World)11 B18.5 µs32.1 µs210.4 µs11.4x6.6x1.74x
Complex (Test QR Code 123)17 B19.8 µs41.3 µs324.1 µs16.2x7.8x2.08x
URL (https://github.com/veaba/qrcodes)31 B24.2 µs53.2 µs453.3 µs18.8x8.5x2.20x
Long (Email: [email protected] | Phone: +1-234-567-8900 | Address: 123 Main St)74 B64.4 µs130.2 µs826.2 µs12.5x6.2x2.02x

同一份数据折算吞吐量(由 µ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:

对比速度提升
@veaba/qrcode-fast vs kennytm-qrcode11x - 19x
@veaba/qrcode-rust vs kennytm-qrcode6x - 9x
@veaba/qrcode-fast vs @veaba/qrcode-rust1.7x - 2.2x

与其他运行时的关系

不提供 qrcode-fast / qrcode-rust 与 Node.js / Bun 实现之间的倍率。 不同运行时的数据出自不同的测量程序与不同的机器,相除得到的倍数没有意义。

SVG 验证

使用 bench/rust-tools 验证工具对生成的 SVG 进行验证:

cd bench/rust-tools
cargo run --release --features validation --bin veaba-qr -- "Hello World"

验证结果 (文本: "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 的多次平均,后者为单次跑批),不可混用。

运行基准测试

# 权威口径: 三方端到端 SVG 性能验证
cd bench/rust-tools
cargo run --release --bin verify-speedup

# 运行包内 Criterion 微基准(口径与 verify-speedup 不同)
cd packages/qrcode-rust
cargo bench --bench comparison_bench

# 验证产物可解码
cd bench/rust-tools
cargo run --release --features validation --bin validate-qr -- "你的文本"

结果文件

文件覆盖范围单位说明
benchmark_speedup_verified.jsonqrcode-fast / qrcode-rust / kennytm-qrcodeµs(附倍率)✅ 权威来源

使用建议

场景推荐包原因
极致性能@veaba/qrcode-fast最快的生成速度,比 kennytm 快 9-19x
功能完整@veaba/qrcode-rust功能完整,比 kennytm 快 6-9x
对比基准kennytm-qrcode社区成熟库,用于性能对比

✅ 文本长度不再有已知的可解码上限问题: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 对比——该对比同时变动运行时与实现两个变量,无法归因)