性能对比
本文档提供各运行时的详细性能对比数据,帮助你选择最适合的包。
测试环境
- 平台: 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-rust 比 kennytm-qrcode 快 8-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: 初始测试数据
数据可能因硬件和版本不同有所差异