Skip to content

性能对比

本文档详细对比 relationship-ts 与原版 JS 版本的性能差异。

版本对比

特性relationship.jsrelationship.ts
类型定义❌ 无✅ 完整 .d.ts
数据结构ObjectMap (O(1) 查找)
缓存机制❌ 无✅ LRU 缓存
包体积83.3 KB78.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 KB78.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 }));

下一步

基于 MIT 许可发布