3.2 KiB
3.2 KiB
交易 SDK 市价缓存去重与正确删除
修复提交
| 仓库 | 分支 | Commit ID | 说明 |
|---|---|---|---|
harmony_futures_trade_sdk |
feature/FUHM-1979-match-push-optimization |
fbfb85d704510fcbe94d1c58f732e0add4a76292 |
修复市价缓存重复写入和删除失效 |
问题
交易 SDK 的 DefaultMarketPriceCacheCenter 使用数组保存 ContractMarketPrice。原有 removeCache() 误用 slice(i, 1),该调用只返回数组片段,不会修改原数组,因此已消费的缓存节点仍被单例缓存中心长期持有。
原有 cachePrice() 对相同 ContractBean + MarketPriceType 的价格也会无条件新增节点。交易页反复取价或刷新时,同一缓存键会持续产生重复对象;即使业务调用删除,旧节点仍无法从数组移除,导致缓存数组和 Local Heap 随调用次数增长。
优化方案
removeCache()使用splice(i, 1)原地删除命中的缓存节点。cachePrice()写入前查找相同合约和价格类型;命中时只更新最新价格并返回,不再追加重复节点。
影响范围
- 生产代码修改位于兄弟仓库
../harmony_futures_trade_sdk/FuTrade的市价缓存中心。 - 主工程不修改交易协议、报价来源或下单流程;正式依赖仍保持
1.0.13,待交易 SDK 发布包含该修复的新版本后再升级版本号和锁定结果。 - 缓存键仍为既有的
ContractBean + MarketPriceType;不同合约或价格类型之间不会互相覆盖。
预期收益与边界
相同缓存键连续更新时,缓存节点数量从随调用次数线性增长收敛为最多一个;缓存被消费后会立即从数组移除。以本次 100 万次重复更新为例,节点数由潜在的 100 万个降至 1 个,删除后降至 0,重复节点消除率接近 100%。
根据 ContractMarketPrice 的对象字段、数组引用和价格字符串开销保守估算,100 万次重复更新可避免约 60~120 MB 的常驻堆增长;20 万次缓存/删除循环可避免约 12~24 MB 的残留。实际 PSS 和 JS Heap 收益受 Ark Runtime 对象布局、字符串表示及 GC 时机影响,仍应以修复前后的同场景 Profiler Trace 为准。
该修改只治理交易 SDK 市价缓存数组的重复节点和错误删除,不覆盖全局行情请求缓冲、实时订阅、整表解析与 UI 全量刷新等其他 OOM 链路。
验证结果
FuTrade@default构建成功并生成新的FuTrade.har;主工程entry@default和entry@ohosTest均通过直接 Hvigor 构建。- 在 Pura 90 模拟器执行 100 万次相同缓存键更新,耗时 148 ms;最终读取到最新价格,删除后缓存为空。
- 在同一测试进程执行 20 万次缓存/删除循环,耗时 90 ms;循环结束后缓存为空。
- Instrumented Test 共执行 4 个用例,结果为
Pass 4 / Failure 0 / Error 0,总测试耗时 239 ms。 - 测试完成后未发现
com.hexin.plat.hmn.futures的 OOM、JS Crash 或 CppCrash 记录。 - 提交前已清理主工程的本地 HAR 路径、
oh_modules同步修改、临时 Instrumented Test 接入和 SDK 测试代码,避免提交不可移植的联调依赖或压力测试代码。