# 交易 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 随调用次数增长。 ## 优化方案 1. `removeCache()` 使用 `splice(i, 1)` 原地删除命中的缓存节点。 2. `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 链路。 ## 验证结果 1. `FuTrade@default` 构建成功并生成新的 `FuTrade.har`;主工程 `entry@default` 和 `entry@ohosTest` 均通过直接 Hvigor 构建。 2. 在 Pura 90 模拟器执行 100 万次相同缓存键更新,耗时 148 ms;最终读取到最新价格,删除后缓存为空。 3. 在同一测试进程执行 20 万次缓存/删除循环,耗时 90 ms;循环结束后缓存为空。 4. Instrumented Test 共执行 4 个用例,结果为 `Pass 4 / Failure 0 / Error 0`,总测试耗时 239 ms。 5. 测试完成后未发现 `com.hexin.plat.hmn.futures` 的 OOM、JS Crash 或 CppCrash 记录。 6. 提交前已清理主工程的本地 HAR 路径、`oh_modules` 同步修改、临时 Instrumented Test 接入和 SDK 测试代码,避免提交不可移植的联调依赖或压力测试代码。