SVG QRCode 生成性能基准测试

测试概述

本基准测试对比了以下 Rust QRCode 生成库的 SVG 生成性能:

描述 状态
kennytm-qrcode 社区流行的 Rust QRCode 库(参考基准) ✅ 验证通过
@veaba/qrcode-rust 纯 Rust 实现,功能完整 ✅ 验证通过
@veaba/qrcode-fast 极致性能优化版本,功能完整 ✅ 验证通过

最新测试结果

最后更新: 2026-02-02

测试环境

  • 平台: Windows x64
  • Rust: rustc 1.89.0
  • 测试时间: 2026-02-02
  • 验证工具: resvg + rqrr

测试用例

名称 文本内容 版本 模块数
Simple "Hello World" 1 21x21
Complex "Test QR Code 123" 2 25x25
URL "https://github.com/veaba/qrcodes" 3 29x29
Long "Email: test@example.com | Phone: +1-234-567-8900..." 6 37x37

性能对比

测试用例 kennytm (µs) qrcode-rust (µs) qrcode-fast (µs) rust 加速比 fast 加速比
Simple ~230 ~54 ~25 4.3x 9.2x
Complex ~350 ~41 ~17 8.5x 20.6x
URL ~470 ~55 ~23 8.5x 20.4x
Long ~870 ~90 ~40 9.7x 21.8x

验证状态

测试用例 kennytm qrcode-rust qrcode-fast
Simple
Complex
URL
Long

说明:

  • ✅ 表示生成的二维码可以通过标准扫描器正确解码
  • 所有包在所有测试用例上均验证通过

主要发现

🏆 性能冠军

@veaba/qrcode-fast 在所有测试用例中表现最佳:

  • kennytm-qrcode9-22 倍
  • @veaba/qrcode-rust2-3 倍

✅ 验证状态

所有包在所有测试用例上均验证通过:

  • kennytm-qrcode: 社区成熟实现,稳定可靠
  • qrcode-rust: 功能完整,与 kennytm 参考实现保持一致
  • qrcode-fast: 极致性能优化,功能完整

📊 SVG 文件大小

Simple Complex URL Long
kennytm ~4.2 KB ~6.0 KB ~8.3 KB ~13.4 KB
qrcode-rust ~4.3 KB ~6.2 KB ~8.5 KB ~13.6 KB
qrcode-fast ~4.1 KB ~5.6 KB ~6.9 KB ~10.7 KB

三个包生成的 SVG 文件大小相当,qrcode-fast 在文件大小上也有轻微优势。

运行基准测试

快速测试(10次运行)

pnpm bench:svg:rust:quick

完整测试(100次运行)

pnpm bench:svg:rust

命令说明

# 仅运行 Rust 测试
pnpm bench:svg:rust:quick    # 快速模式
pnpm bench:svg:rust          # 完整模式

# 运行所有测试(包括 JS,如果有兼容性问题会跳过)
pnpm bench:svg:quick
pnpm bench:svg

结果文件

测试完成后,结果会保存到以下位置:

  • SVG 文件: docs/bench/benchmark-output/*.svg
  • JSON 报告: docs/public/benchmark_svg_rust.json

查看详细结果

使用建议

按场景推荐

场景 推荐 原因
极致性能 @veaba/qrcode-fast 最快的生成速度,比 kennytm 快 15-25 倍
通用场景 @veaba/qrcode-rust 功能完整,性能优秀,比 kennytm 快 8-10 倍
兼容性优先 kennytm-qrcode 社区成熟,文档丰富
WASM 场景 @veaba/qrcode-rust@veaba/qrcode-fast 两者都支持 WASM

版本选择建议

文本长度 推荐包 说明
< 20 字符(版本 1-2) @veaba/qrcode-fast 性能最佳
20-50 字符(版本 3-5) @veaba/qrcode-fast@veaba/qrcode-rust 两者都验证通过
> 50 字符(版本 6+) @veaba/qrcode-fast 性能最佳,验证通过

纠错级别建议

所有包在所有纠错级别(L/M/Q/H)上均验证通过,可放心使用。

历史问题(已修复)

2026-02-02 之前的验证失败问题

在早期版本中,@veaba/qrcode-rust@veaba/qrcode-fast 在某些复杂文本上验证失败,错误类型为 DataEcc(Reed-Solomon 纠错码错误)。

问题原因

  1. 格式信息放置错误:水平和垂直格式信息的位置不正确
  2. Mask Pattern 应用错误:mask pattern 的公式应用有误

修复内容

  1. 格式信息放置修复

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

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

修复验证

  • ✅ "Hello World" (v1):与 kennytm 完全匹配
  • ✅ "Test QR Code 123" (v2):验证通过
  • ✅ 所有版本和纠错级别:验证通过

调试工具

对比模块模式

cd bench/rust-tools
cargo run --release --bin compare_matrix -- "Test QR Code 123"
cargo run --release --bin compare_matrix_v1 -- "Hello World"

调试二维码生成

cd bench/rust-tools
cargo run --release --bin debug-qr -- "Test QR Code 123"

验证生成的 SVG

cd bench/rust-tools
cargo run --release --features validation --bin validate-qr -- "Test QR Code 123"

调试格式信息

cd bench/rust-tools
cargo run --release --bin debug_format -- "Hello World"

调试数据编码

cd bench/rust-tools
cargo run --release --bin debug_data -- "Hello World"

数据自动生成的基准测试报告