性能对比

本文档提供各运行时的详细性能对比数据,帮助你选择最适合的包。

测试环境

  • 平台: Windows
  • Node.js: v20.19.4
  • Bun: v1.3.0
  • Rust: v1.89.0
  • 测试时间: 2026-02-02

综合性能对比

单条生成性能

运行时 ops/s 单次耗时 相对性能
Rust (@veaba/qrcode-fast) 54,283 18.4 μs 🥇 最快
Rust (@veaba/qrcode-rust) ~19,608 51.0 μs 🥈 很快
Bun (medium) 20,718 48.3 μs 🥈 很快
Bun (short) 18,071 55.3 μs 🥈 很快
Node.js (medium) 13,723 72.9 μs 2.6x 慢
Node.js (short) 15,148 66.0 μs 2.3x 慢
单条生成 - 中等文本 (ops/s,越高越好) Rust: ████████████████████████████████████████████████████████████████████ 54,283 Bun: ██████████████████████████████████████████████ 20,718 Node.js: ████████████████████████████████████ 13,723

批量生成性能 (1000 条)

运行时 ops/s 总耗时 相对性能
Bun 19,000 51.8 ms 🥇 基准
Rust 原生 ~25,000 ~40 ms 🥇 更快
Node.js 7,000 146.1 ms 2.8x 慢
批量 1000 条 (ops/s,越高越好) Bun: ████████████████████████████████████████████████████████ 19,000 Node.js: ██████████████████████ 7,000

Rust 包对比(vs kennytm-qrcode)

测试项 @veaba/qrcode-rust kennytm-qrcode 速度提升
单条生成 ~51.0 µs ~438.3 µs 8.6x
批量 100 条 ~4.01 ms ~32.13 ms 8.0x
纠错级别 L ~29.0 µs ~306.5 µs 10.6x
纠错级别 H ~42.0 µs ~446.2 µs 10.6x

结论: @veaba/qrcode-rustkennytm-qrcode8-10 倍

详细测试数据

@veaba/qrcode-node (Node.js)

单条生成 (short): 15,148 ops/s, 0.0660 ms/op 单条生成 (medium): 13,723 ops/s, 0.0729 ms/op 单条生成 (long): 3,932 ops/s, 0.2543 ms/op 单条生成 (unicode): 10,648 ops/s, 0.0939 ms/op 批量生成 (10 条): 13,050 ops/s, 0.7663 ms/op 批量生成 (100 条): 6,500 ops/s, 15.4275 ms/op 批量生成 (1000 条): 7,000 ops/s, 146.0795 ms/op SVG 输出: 14,749 ops/s, 0.0678 ms/op Styled SVG 输出: 8,409 ops/s, 0.1189 ms/op PNG Buffer 输出: 3,472 ops/s, 0.2881 ms/op 纠错级别 L: 10,838 ops/s, 0.0923 ms/op 纠错级别 M: 10,986 ops/s, 0.0910 ms/op 纠错级别 Q: 10,862 ops/s, 0.0921 ms/op 纠错级别 H: 15,431 ops/s, 0.0648 ms/op 异步单条生成: 15,656 ops/s, 0.0639 ms/op

@veaba/qrcode-bun (Bun)

单条生成 (short): 18,071 ops/s, 0.0553 ms/op 单条生成 (medium): 20,718 ops/s, 0.0483 ms/op 单条生成 (long): 7,132 ops/s, 0.1402 ms/op 单条生成 (unicode): 17,586 ops/s, 0.0569 ms/op 批量生成 (10 条): 18,710 ops/s, 0.5344 ms/op 批量生成 (100 条): 16,900 ops/s, 5.9143 ms/op 批量生成 (1000 条): 19,000 ops/s, 51.7963 ms/op SVG 输出: 21,235 ops/s, 0.0471 ms/op Styled SVG 输出: 11,439 ops/s, 0.0874 ms/op 获取模块数据: 21,366 ops/s, 0.0468 ms/op 纠错级别 L: 31,739 ops/s, 0.0315 ms/op 纠错级别 M: 24,932 ops/s, 0.0401 ms/op 纠错级别 Q: 23,829 ops/s, 0.0420 ms/op 纠错级别 H: 24,058 ops/s, 0.0416 ms/op 异步单条生成: 15,768 ops/s, 0.0634 ms/op TextEncoder 编码: 6,535,521 ops/s, 0.0002 ms/op

@veaba/qrcode-rust (原生)

single_generation: time: [50.915 µs 51.030 µs 51.156 µs] (~19,608 ops/s) batch_generation_100: time: [3.9972 ms 4.0068 ms 4.0165 ms] (~24,959 ops/s) svg_generation: time: [34.599 µs 34.742 µs 34.894 µs] (~28,780 ops/s) error_level_L: time: [28.890 µs 28.974 µs 29.058 µs] (~34,518 ops/s) error_level_M: time: [28.605 µs 28.712 µs 28.837 µs] (~34,827 ops/s) error_level_Q: time: [40.171 µs 40.480 µs 40.829 µs] (~24,703 ops/s) error_level_H: time: [41.606 µs 41.960 µs 42.347 µs] (~23,832 ops/s)

@veaba/qrcode-fast (Rust 优化版)

single_generation: time: [18.420 µs] (~54,283 ops/s) svg_generation: time: [10.810 µs] (~92,486 ops/s) error_level_L: time: [16.300 µs] (~61,368 ops/s) error_level_H: time: [21.080 µs] (~47,436 ops/s)

注: qrcode-fast 生成伪数据,仅用于性能测试

Node.js vs Bun 详细对比

测试项 Node.js Bun Bun 优势
单条生成 (short) 15,148 18,071 +19.3%
单条生成 (medium) 13,723 20,718 +51.0%
单条生成 (long) 3,932 7,132 +81.4%
单条生成 (unicode) 10,648 17,586 +65.2%
批量生成 (10) 13,050 18,710 +43.4%
批量生成 (100) 6,500 16,900 +160.0%
批量生成 (1000) 7,000 19,000 +171.4%
SVG 输出 14,749 21,235 +44.0%
Styled SVG 8,409 11,439 +36.0%
纠错级别 L 10,838 31,739 +192.8%
纠错级别 M 10,986 24,932 +126.9%
纠错级别 Q 10,862 23,829 +119.4%
纠错级别 H 15,431 24,058 +55.9%
异步单条 15,656 15,768 +0.7%

纠错级别性能

不同纠错级别对性能的影响:

纠错级别 容错率 Rust Bun Node.js
L (低) ~7% 28.97 µs 31.5 µs 92.3 µs
M (中) ~15% 28.71 µs 40.1 µs 91.0 µs
Q (较高) ~25% 40.48 µs 42.0 µs 92.1 µs
H (高) ~30% 41.96 µs 41.6 µs 64.8 µs

内存使用

包大小对比

压缩后 解压后 说明
@veaba/qrcode-js 8 KB 15 KB 纯 JS
@veaba/qrcode-wasm 25 KB 80 KB 含 .wasm
@veaba/qrcode-node 10 KB 20 KB 服务端
@veaba/qrcode-bun 10 KB 20 KB 服务端

启动时间

运行时 冷启动 热启动 说明
Rust 0 ms 0 ms 原生代码
Bun 10 ms 5 ms 快速启动
Node.js 50 ms 30 ms 需加载模块
WASM 100 ms 0 ms 首次需初始化

选择建议

根据场景选择

场景 推荐包 原因
前端生产环境 @veaba/qrcode-js 包小,无需 WASM 初始化
前端高性能 @veaba/qrcode-wasm 浏览器中更快
Node.js 后端 @veaba/qrcode-node 支持 PNG,生态丰富
Bun 后端 @veaba/qrcode-bun 批量性能最优(快 2-3 倍)
Rust 项目 @veaba/qrcode-rust 极致性能,比 kennytm 快 8-10 倍
边缘计算 @veaba/qrcode-bun 启动快,批量性能优

根据性能需求选择

性能需求 推荐运行时 预期 ops/s
极致性能 Rust 原生 (@veaba/qrcode-fast) 54,000+
生产 Rust @veaba/qrcode-rust 19,000+
批量生成 Bun 20,000
前端高性能 WASM ~15,000
一般需求 Node.js 13,000-15,000

根据功能需求选择

功能需求 推荐包
PNG 输出 @veaba/qrcode-node / @veaba/qrcode-bun
样式化 SVG 任意包(都支持)
批量生成 @veaba/qrcode-bun / @veaba/qrcode-rust
最小包体积 @veaba/qrcode-js
SVG 验证 使用 bench/rust-tools

SVG 验证

使用 bench/rust-tools 验证生成的 SVG:

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

# 输出示例:
# 📦 @veaba/qrcode-rust
# ⏱️  生成耗时: 66.7µs
# 🔍 验证中...
# ✅ 验证通过!

验证结果:

  • @veaba/qrcode-rust - 生成的 SVG 可通过标准二维码扫描器正确解码
  • ⚠️ @veaba/qrcode-fast - 生成伪数据,仅用于性能测试

优化建议

1. 使用缓存

所有公开包都内置缓存系统:

// 浏览器环境
import { QRCode, QRErrorCorrectLevel } from '@veaba/qrcode-js';

const qr = new QRCode('https://example.com', QRErrorCorrectLevel.H);
// 实例可复用

2. 批量生成

// Bun 批量性能最优
import { QRCode, QRErrorCorrectLevel } from '@veaba/qrcode-bun';

const texts = Array.from({ length: 1000 }, (_, i) => `https://example.com/${i}`);
const svgs = texts.map(text => {
  const qr = new QRCode(text, QRErrorCorrectLevel.H);
  return qr.toSVG(256);
});

3. 复用实例

// WASM 中复用实例
const qr = new QRCode('text', QRErrorCorrectLevel.H);
// 复用同一实例

基准测试运行

Node.js

cd packages/qrcode-node
node benchmark/index.js

Bun

cd packages/qrcode-bun
bun run benchmark/index.ts

Rust

cd packages/qrcode-rust
cargo bench --bench comparison_bench

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

更新记录

  • 2026-02-02: 更新测试数据,基于最新基准测试
    • 添加了 @veaba/qrcode-fast 的性能数据
    • 添加了与 kennytm-qrcode 的对比数据
    • 添加了 SVG 验证说明
  • 2026-02-01: 初始测试数据

数据可能因硬件和版本不同有所差异