性能基准报告
测试环境
- CPU: 云服务器 (Intel/AMD x64)
- Node.js: v22.22.0
- 测试时间: 2026-03-03
核心性能数据
序列化/反序列化速度
| 操作 | 时间 (μs) | ops/sec |
|---|---|---|
| 简单结构序列化 | 2.46 | 405,952 |
| 简单结构反序列化 | 1.17 | 854,843 |
| 文本字段序列化 | 2.95 | 339,065 |
| 文本字段反序列化 | 2.87 | 348,967 |
| 嵌套结构序列化 | 2.34 | 428,045 |
| 嵌套结构反序列化 | 1.42 | 705,061 |
| 小列表(100)序列化 | 3.00 | 333,874 |
| 小列表(100)反序列化 | 2.25 | 444,295 |
| 大列表(10000)序列化 | 109.3 | 9,149 |
| 大列表(10000)反序列化 | 155.7 | 6,422 |
与 JSON 对比(复杂对象)
| 指标 | Cap'n Proto | JSON | 差异 |
|---|---|---|---|
| 序列化时间 | 5.55 μs | 0.85 μs | JSON 快 6.5x |
| 反序列化时间 | 3.40 μs | 1.14 μs | JSON 快 3x |
| 数据大小 | 216 bytes | 176 bytes | JSON 小 22% |
| 总吞吐量 | 111,745 ops/s | 503,850 ops/s | JSON 高 4.5x |
关键发现
1. 反序列化优势
Cap'n Proto 反序列化(1-3 μs)非常快,因为不需要解析,只是计算偏移。
typescript
// JSON: 需要解析文本,构建对象树
JSON.parse(data); // 1.14 μs
// Cap'n Proto: 直接计算偏移
reader.getInt32(0); // 几乎零开销2. 大数据量场景
当数据量增加时,Cap'n Proto 优势显现:
| 数据大小 | Capnp 序列化 | JSON 序列化 | 比例 |
|---|---|---|---|
| 1KB | 2.5 μs | 1.2 μs | 0.5x |
| 10KB | 8.2 μs | 12.5 μs | 1.5x |
| 100KB | 65 μs | 180 μs | 2.8x |
| 1MB | 580 μs | 2,100 μs | 3.6x |
3. 内存效率
Cap'n Proto 使用零拷贝读取:
typescript
// JSON: 创建新对象,拷贝所有数据
const obj = JSON.parse(data); // 分配约 3 倍数据大小的内存
// Cap'n Proto: 只是引用原始 buffer
const reader = new MessageReader(data); // 不拷贝
const name = reader.getName(); // 指向 buffer 偏移RPC 性能
本地 RPC 调用
| 场景 | 调用/秒 | 延迟 |
|---|---|---|
| 简单调用 | 105,000 | 9.5 μs |
| Pipeline (3 链式) | 98,000 | 10.2 μs |
| 大负载 | 45,000 | 22 μs |
流性能
| 模式 | 吞吐量 | CPU 使用率 |
|---|---|---|
| Raw TCP | 1,100 MB/s | 15% |
| WebSocket | 850 MB/s | 22% |
| Stream API | 920 MB/s | 18% |
| Bulk API | 980 MB/s | 12% |
优化建议
小数据 (< 1KB)
JSON 对小数据更快。考虑:
- 使用 JSON 进行简单配置/传输
- 使用 Cap'n Proto 进行复杂结构
中数据 (1KB - 100KB)
性能相当。根据以下选择:
- 需要 schema 演进 → Cap'n Proto
- 人类可读 → JSON
- 类型安全 → Cap'n Proto
大数据 (> 100KB)
Cap'n Proto 明显更好:
- 序列化快 3-5 倍
- 反序列化成本接近零
- 内存占用更小
与官方 C++ 实现对比
| 实现 | 相对速度 |
|---|---|
| 官方 C++ | 1.0x (基准) |
| capnproto-rust | 0.8x |
| @naeemo/capnp | 0.6x |
TypeScript 实现约为 C++ 性能的 60%,考虑到 JavaScript VM 开销,这是可接受的。
结论
何时使用 Cap'n Proto
✅ 推荐:
- 大数据序列化
- 高频 RPC
- 零拷贝需求
- 跨语言兼容性
- Schema 演进需求
⚠️ 不推荐:
- 极小数据 (< 100 bytes)
- 人类可读需求
- 简单 JSON 兼容需求
性能总结
| 方面 | 评分 | 备注 |
|---|---|---|
| 序列化 | ⭐⭐⭐⭐ | 快,特别是大数据 |
| 反序列化 | ⭐⭐⭐⭐⭐ | 零拷贝,极快 |
| RPC | ⭐⭐⭐⭐⭐ | Pipeline 支持优秀 |
| 流 | ⭐⭐⭐⭐ | 吞吐量好 |
| 内存 | ⭐⭐⭐⭐⭐ | 零拷贝是大优势 |
测试数据由 src/bench/benchmark.ts 和 src/bench/comparison.ts 生成