Rust QRCode 性能比较
测试环境
- 平台: Windows x64
- Rust: rustc 1.89.0,release (opt-level 3)
- 测量时间: 2026-03-20(
benchmark_speedup_verified.json的generated_at)
比较的包
qrcode-rust- 功能完整的 Rust QRCode 实现qrcode-fast- 极致性能优化版本kennytm-qrcode- 流行的 Rust QRCode 库(作为基准)
📊 性能可视化
端到端 SVG 生成对比
数据来源:
benchmark_speedup_verified.json,单位 µs(越低越好)。
端到端 SVG 生成 (µs/op) - 越低越好
不同纠错级别性能
⚠️ 纠错级别性能:未重新测量
本页此前展示的 L/M/Q/H 四级别柱状图(rust 30.7 / 34.1 / 63.6 / 44.9 µs,fast 16.0 / 16.3 / 17.0 / 19.8 µs, kennytm 323.94 / 324.08 / 327.76 / 491.10 µs)来自已撤回的测量批次,其 kennytm 基线与当前代码对不上,因此不再展示。
当前 bench/rust-tools 中没有按纠错级别分组的基准程序,权威数据文件 benchmark_speedup_verified.json 也只有 Simple / Complex / URL / Long 四个用例(全部使用默认的 H 级别)。 如需该维度数据,请先补充基准程序后重新测量。
🚀 性能提升
🚀 性能提升倍数(相对于 kennytm-qrcode)
@veaba 包相对于 kennytm-qrcode 的性能提升:
📋 功能对比
| 功能 | qrcode-rust | qrcode-fast | kennytm-qrcode |
|---|---|---|---|
| SVG 输出 | ✓ | ✓ | ✓ |
| PNG 输出 | ✓ | ✓ | ✓ |
| 字符串输出 | ✓ | ✓ | ✓ |
| 自定义样式 | 完整 | 完整 | 有限 |
| 纠错级别 L/M/Q/H | ✓ | ✓ | ✓ |
| 异步支持 | ✓ | ✓ | ✗ |
| WASM 支持 | ✓ | ✓ | ✗ |
| Node.js 绑定 | 计划中 | 计划中 | ✗ |
| 性能优化 | 优秀 | 极致 | 良好 |
性能测试结果
三者对比
以下为权威数据文件 benchmark_speedup_verified.json 的完整内容(2026-03-20,Windows x64,rustc 1.89.0)。
测量口径:端到端 SVG 生成(make_code + get_svg() / kennytm 的 render().build()),三方实现同一进程内依次测量,
每用例预热 20 次后重复 100 次取算术平均值,产物经 resvg + rqrr 独立解码验证。
复现命令:
汇总区间:qrcode-fast vs kennytm-qrcode 9-19x,qrcode-rust vs kennytm-qrcode 6-9x,qrcode-fast vs qrcode-rust 1.5-2.2x。
⚠️ 这些倍率是单机单次测量结果,不同 CPU / 编译器版本会有差异,应视为量级参考而非精确承诺。 「快多少倍」取决于输入长度与用例:实测最低值出现在
SiteUrl(25 B,fast vs rust 1.47x), 最高值出现在原URL用例(31 B,fast vs kennytm 18.8x)。
本轮未测量的维度
以下两类此前的表格已删除,因为它们来自无法复现的测量批次:
- 纠错级别 L/M/Q/H:权威数据文件只含四个用例(均为默认 H 级别),
bench/rust-tools中也没有按级别分组的基准程序 - 批量生成 (100 条):旧表的 "rust ~4.21 ms / fast ~2.09 ms / kennytm ~34.12 ms" 在
bench/rust-tools中没有对应的批量基准程序
关于「SVG 生成」这一行
旧表中有一行 "SVG 生成:rust ~35.9 µs / fast ~10.5 µs / kennytm ~4.1 µs(fast 0.4x)"。 该行的 kennytm 数值并非 SVG XML,而是直接输出的字符画,属于不同口径的功能对比,放在同一张 µs 表里会误导,已删除。
如需查看 Rust 三方在 SVG 输出上的对比,请以本节上方的端到端表格为准 —— 那里的 kennytm 列确实是
render::<svg::Color>().build() 生成的 SVG。
验证结果
使用 rust-tools 验证工具对生成的 SVG 进行验证:
验证结论:
qrcode-rust生成的二维码 SVG 可以通过标准二维码扫描器正确解码,内容匹配qrcode-fast生成的二维码也可正确解码
与 kennytm-qrcode 的兼容性
经过详细调试和修复,qrcode-rust 和 qrcode-fast 现在与 kennytm-qrcode 在以下方面保持一致:
关键修复 (2026-02-02)
-
格式信息放置修复
- 垂直方向(第8列):从上到下正确放置
- 水平方向(第8行):从右到左正确放置
- 正确处理 test 模式(格式信息位在 test 模式下为白色)
-
Mask Pattern 修复
- 统一使用 mask pattern 0:
(row + col) % 2 == 0 - 确保与 kennytm 的默认选择一致
- 统一使用 mask pattern 0:
使用建议
运行基准测试
注意:Criterion 的
comparison_bench与verify-speedup是两套不同的口径, 本页的所有倍率均以verify-speedup的输出(即benchmark_speedup_verified.json)为准。
详细报告位置
基准测试的详细报告生成在:
target/criterion/- Criterion 基准测试报告(仅覆盖包内微基准)
可以使用浏览器打开查看图表和详细分析:
技术细节
测试方法
本页权威数字使用 bench/rust-tools 的 verify-speedup:
- 预热次数: 20 次/用例
- 采样次数: 100 次/用例
- 统计量: 算术平均值
- 口径: 端到端 SVG 生成(
make_code+get_svg()/render().build()) - 正确性: resvg 渲染 + rqrr 独立解码
此外 packages/qrcode-rust 下另有基于 Criterion.rs 的微基准(预热 3 秒,约 5 秒/测试),
其结果不与本页倍率混用。
测试数据
本页权威表格(verify-speedup)使用的四个用例:
- Simple:
"Hello World"(11 字节) - Complex:
"Test QR Code 123"(17 字节) - URL:
"https://github.com/veaba/qrcodes"(31 字节) - Long:
"Email: [email protected] | Phone: +1-234-567-8900 | Address: 123 Main St"(74 字节)
历史版本此处列的是短/中/长三档(12 / 36 / 98 字符),那是 Criterion 微基准的输入, 与本页权威表格的四个用例不同,不要对应。
✅ 关于解码能力:
benchmark_speedup_verified.json的capability说明两个 Rust 包现已覆盖 全部 40 个版本,H 级最大 1273 字节(QR 标准上限),与 JS 实现一致。 此前的长度限制(qrcode-fast约 110 字节、qrcode-rust约 60 字节)与实例复用缺陷均已修复, 详见该文件的fixed_defects。复现:cargo run --release --features validation --bin scan-max。
SVG 验证工具
位于 bench/rust-tools,提供以下功能:
validate-qr- 生成并验证二维码scan-max- 逐点扫描最大可解码长度(1..1400 字节)+ 独立解码验证verify-capacity-table- 容量表 vs QR 标准(160 项,含边界行为断言)check-min-version- 校验版本选择与容量表边界verify-speedup- 三方端到端性能验证(权威口径)compare_matrix- 对比模块矩阵与 kennytmcompare_matrix_v1- 对比版本 1 的矩阵
权威数据文件: benchmark_speedup_verified.json
其他数据文件: benchmark_svg_rust.json(旧口径,勿与权威文件混用)
测试代码: bench/rust-tools/src/bin/verify_speedup.rs、packages/qrcode-rust/benches/comparison_bench.rs
最后更新: 2026-03-20(撤回伪数据时代的倍率与纠错级别/批量表格,统一引用 benchmark_speedup_verified.json;删除 Node.js / Bun 对比的数据文件链接)