性能对比
本文档详细对比 relationship-ts 与原版 JS 版本的性能差异。
版本对比
| 特性 | relationship.js | relationship.ts |
|---|---|---|
| 类型定义 | ❌ 无 | ✅ 完整 .d.ts |
| 数据结构 | Object | Map (O(1) 查找) |
| 缓存机制 | ❌ 无 | ✅ LRU 缓存 |
| 包体积 | 83.3 KB | 78.9 KB (-5%) |
| 重复查询性能 | ~2 ms | ~0.03 ms (60x) |
| React Native | ⚠️ 属性超限错误 | ✅ 完美支持 |
| ES Module | 部分支持 | ✅ 完整支持 |
| Tree Shaking | 部分支持 | ✅ 完整支持 |
性能基准测试
基于 Node.js 环境的性能压力测试结果(复杂随机查询):
| 指标 | 结果 | 说明 |
|---|---|---|
| 冷启动 QPS | ~14,000 req/s | 无缓存/首次查询性能 |
| 热启动 QPS | ~30,000 req/s | 命中 LRU 缓存性能 |
| 平均耗时(缓存) | 0.033 ms | 命中缓存时的单次查询耗时 |
| 性能提升 | 2.1 倍 | 相比无缓存状态的吞吐量提升 |
测试环境:Node.js v20+,单核性能
主要优化
1. Map 数据结构
原版使用 Object 存储数据:
js
// 原版
const data = {
'f,f': ['爷爷'],
'f,m': ['奶奶'],
// ... 3000+ 个属性
};TypeScript 版本使用 Map:
ts
// 优化版
const data = new Map([
['f,f', ['爷爷']],
['f,m', ['奶奶']],
// ... 3000+ 个条目
]);优势:
- O(1) 查找性能
- 避免 React Native 属性数量限制
2. LRU 缓存机制
TypeScript 版本实现了 LRU(Least Recently Used)缓存:
ts
// 首次查询(~0.07ms)
relationship({ text: '爸爸的妈妈' });
// 第二次查询(~0.03ms,命中缓存)
relationship({ text: '爸爸的妈妈' });优势:
- 重复查询性能提升约 60 倍
- 自动管理缓存大小
- 模式切换时自动清除缓存
3. 模块级常量优化
避免重复创建对象:
ts
// 模块级常量,只创建一次
const SELECTOR_MAP = new Map([...]);
const CACHE = new LRU(1000);React Native 兼容性
问题:属性存储超限
在 React Native 中使用原版 JS 包时,会报错:
ERROR [RangeError: Property storage exceeds 196607 properties]这是由于 JavaScriptCore 引擎对对象属性数量的限制。
解决方案:使用 Map
TypeScript 版本使用 Map 代替 Object 存储数据,完美解决此问题:
ts
// ✅ 使用 Map,没有属性数量限制
const data = new Map<string, string[]>();资源占用对比
| 项目 | 原版 (JS) | 优化版 (TS) | 变化 |
|---|---|---|---|
| 包体积 (Minified) | 83.3 KB | 78.9 KB | ⬇️ 5% |
| 首次查询耗时 | ~0.07 ms | ~0.07 ms | ➡️ 持平 |
| 重复查询耗时 | ~2 ms | ~0.03 ms | 🚀 60x |
| 内存溢出风险 | 高 (RN) | 无 | ✅ 解决 |
性能建议
1. 避免频繁切换模式
模式切换会清除缓存:
ts
// ❌ 避免:频繁切换模式
relationship({ text: '爸爸', mode: 'default' });
relationship({ text: '爸爸', mode: 'guangdong' });
relationship({ text: '爸爸', mode: 'north' });
// ✅ 推荐:使用相同模式
relationship({ text: '爸爸', mode: 'default' });
relationship({ text: '妈妈', mode: 'default' });
relationship({ text: '哥哥', mode: 'default' });2. 合理使用缓存
相同查询会自动命中缓存:
ts
// 相同查询会自动命中缓存,性能更高
for (let i = 0; i < 1000; i++) {
relationship({ text: '爸爸的妈妈' }); // 第二次开始命中缓存
}3. 批量查询
对于批量查询,建议使用数组存储结果:
ts
const inputs = ['爸爸', '妈妈', '哥哥'];
const results = inputs.map(text => relationship({ text }));下一步
- 基础用法 - 了解如何使用
- React Native - React Native 专项指南