Rust QRCode 性能比较

测试环境

比较的包

  • qrcode-rust - 功能完整的 Rust QRCode 实现
  • qrcode-fast - 极致性能优化版本
  • kennytm-qrcode - 流行的 Rust QRCode 库(作为基准)

📊 性能可视化

端到端 SVG 生成对比

数据来源:benchmark_speedup_verified.json,单位 µs(越低越好)。

端到端 SVG 生成 (µs/op) - 越低越好

Simple (Hello World)32.1 µs18.5 µs210.4 µsComplex (Test QR Code 123)41.3 µs19.8 µs324.1 µsURL (31 B)53.2 µs24.2 µs453.3 µsLong (74 B)130.2 µs64.4 µs826.2 µsqrcode-rustqrcode-fastkennytm-qrcode

不同纠错级别性能

⚠️ 纠错级别性能:未重新测量

本页此前展示的 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 的性能提升:

Simple (11 B)
6.6x
qrcode-rust
|
11.4x
qrcode-fast
Complex (17 B)
7.8x
qrcode-rust
|
16.2x
qrcode-fast
URL (31 B)
8.5x
qrcode-rust
|
18.8x
qrcode-fast
Long (74 B)
6.2x
qrcode-rust
|
12.5x
qrcode-fast

📋 功能对比

功能qrcode-rustqrcode-fastkennytm-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 独立解码验证。

复现命令:

cd bench/rust-tools && cargo run --release --bin verify-speedup
用例文本长度qrcode-rustqrcode-fastkennytm-qrcoderust vs kennytmfast vs kennytmfast vs rust
Simple (Hello World)11 B~32.1 µs~18.5 µs~210.4 µs6.6x11.4x1.74x
Complex (Test QR Code 123)17 B~41.3 µs~19.8 µs~324.1 µs7.8x16.2x2.08x
URL (https://github.com/veaba/qrcodes)31 B~53.2 µs~24.2 µs~453.3 µs8.5x18.8x2.20x
Long (74 B)74 B~130.2 µs~64.4 µs~826.2 µs6.2x12.5x2.02x

汇总区间: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 进行验证:

# 生成并验证二维码
cargo run --release --features validation --bin validate-qr -- "Hello World"

# 输出:
# 🚀 QRCode 生成 + 验证工具
# ═══════════════════════════════════════
# 文本: Hello World
# 
# ✅ 验证通过!
#    二维码可以被正确扫描
#    内容匹配: 'Hello World'

验证结论:

  • qrcode-rust 生成的二维码 SVG 可以通过标准二维码扫描器正确解码,内容匹配
  • qrcode-fast 生成的二维码也可正确解码

与 kennytm-qrcode 的兼容性

经过详细调试和修复,qrcode-rust 和 qrcode-fast 现在与 kennytm-qrcode 在以下方面保持一致:

测试内容结果说明
"Hello World" (v1)✅ 完全匹配模块矩阵与 kennytm 完全一致
"Test QR Code 123" (v2)✅ 验证通过使用 mask pattern 0,可正确扫描
格式信息✅ 正确放置水平和垂直格式信息位置与 kennytm 一致
Mask Pattern✅ 正确应用Mask pattern 0: (row + col) % 2 == 0

关键修复 (2026-02-02)

  1. 格式信息放置修复

    • 垂直方向(第8列):从上到下正确放置
    • 水平方向(第8行):从右到左正确放置
    • 正确处理 test 模式(格式信息位在 test 模式下为白色)
  2. Mask Pattern 修复

    • 统一使用 mask pattern 0: (row + col) % 2 == 0
    • 确保与 kennytm 的默认选择一致

使用建议

场景推荐包原因
通用场景qrcode-rust功能完整,性能优秀,比 kennytm 快 6-9 倍
极致性能qrcode-fast比 kennytm 快 9-19 倍,功能完整
兼容性优先kennytm-qrcode社区成熟,文档丰富
WASM 场景qrcode-rust 或 qrcode-fast两者都支持 WASM

运行基准测试

# 权威口径:三方端到端 SVG 生成,同机同进程,100 次/用例取平均
cd bench/rust-tools
cargo run --release --bin verify-speedup

# 产物可解码性边界探测(全长度必跑)
cargo run --release --features validation --bin scan-max

# Criterion 微基准(仅 qrcode-rust / qrcode-fast 的包内对比,不含 kennytm)
cd packages/qrcode-rust
cargo bench --bench comparison_bench

# 查看详细报告
target/criterion/report/index.html

# 使用 rust-tools 验证生成的 SVG
cd bench/rust-tools
cargo run --release --features validation --bin validate-qr -- "你的文本"

注意:Criterion 的 comparison_bench 与 verify-speedup 是两套不同的口径, 本页的所有倍率均以 verify-speedup 的输出(即 benchmark_speedup_verified.json)为准。

详细报告位置

基准测试的详细报告生成在:

  • target/criterion/ - Criterion 基准测试报告(仅覆盖包内微基准)

可以使用浏览器打开查看图表和详细分析:

# 在 Windows 上
start target/criterion/report/index.html

技术细节

测试方法

本页权威数字使用 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 - 对比模块矩阵与 kennytm
  • compare_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 对比的数据文件链接)