Files

3.8 KiB

TOP10 线上耗时函数后续候选项

修复说明

本笔记为线上 TOP10 耗时函数的分析、候选项与建议修复顺序,未包含生产修复本身;候选的实现见 11-top10-followup-fixes.md(对应本仓库 commit 0d10cf71a01c8c5d875ca4c950d6d2fd71d3fd42)。

数据来源

2026-08-21 从 ~/Downloads/TOP10耗时函数列表.md 补充线上真实 TOP10 耗时函数统计。该列表是函数采样聚合,不等价于完整冻屏根因;短函数命中通常表示它处在更长的调用链上,需要结合完整 faultlog/采样栈判断。

TOP 函数 故障出现次数 调用次数 总耗时
1 writeReceiveTime entry|@kernel/lib_communication|1.1.1-beta.1|src/main/ets/components/communication/protocol/MiniDataHead.ts 1 2 600ms
2 anonymous entry|@kernel/lib_communication|1.1.1-beta.1|src/main/ets/request/QueueManagement.ts 1 2 600ms
3 anonymous entry|@b2b/hq_table|1.0.0-rc.9|src/main/ets/model/data/TableDataSource.ts 1 10 3000ms
4 isNumber entry|@b2c-f/futures_ohos_trade_sdk|1.0.13|src/main/ets/trade/util/StringUtil.ts 1 2 600ms
5 transFormServerColor entry|@b2c/lib_baseui|1.0.0|src/main/ets/utils/ColorUtils.ts 1 2 600ms
6 isArbitrageEnabled entry|biz_trade|1.0.0|src/main/ets/trade/manager/TradeCustomTabManager.ts 1 4 1200ms
7 sendMsg entry|@b2c-f/futures_ohos_trade_sdk|1.0.13|src/main/ets/trade/api/rpc/RspSendMsgCenterImpl.ts 1 10 3000ms
8 showOrderNameCell entry|biz_trade|1.0.0|src/main/ets/views/tab/ContractNameCellView.ts 1 4 1200ms
9 anonymous entry|biz_futures_chart|1.0.0|src/main/ets/view/View.ts 1 6 1800ms
10 onForeground entry|biz_trade|1.0.0|src/main/ets/views/tab/TradeGuaDanListView.ts 1 10 3000ms

当前判断

  • hq_table 表格数据合并是优先级最高的新增候选:TableDataSource.notifyDataSetChanged() 仍在主线程逐行 merge、创建默认行并触发可见行更新,TOP3 达到 10 次调用、3000ms。
  • lib_communication 队列管理仍有结构性优化空间:QueueManagement 通过遍历 Map<ITCPClient, Map<InstanceId, InstanceId[]>> 完成注册、删除、映射和分发查找,可改为维护 instanceId 索引减少线性扫描。
  • biz_trade 套利开关可做缓存:isArbitrageEnabled() 会进入 TradeFunctionSwitch.isSupportArbitrageTrade()GrayTestManager.isFeatureEnable(),灰度命中时包含日志和 JSON.stringify(grayConfig),不适合在列表构建中高频调用。
  • ContractNameCellView.showOrderNameCell()ColorUtils.transFormServerColor()StringUtil.isNumber()BaseView 绘制/布局闭包本身都较短,当前不应只针对短函数微调,应先定位其上层列表刷新、图表刷新或交易请求链路。

建议修复顺序

  1. hq_table 源码侧优化 TableDataSource.notifyDataSetChanged():减少全量行合并、只更新可见区、批量合并 notifyChange(),必要时将可 Sendable 的数据预处理继续前移到子线程。
  2. 在通信 SDK 源码侧重构 QueueManagement 索引:新增 instanceId -> clients 和 companion 映射,保留原公开接口,避免响应分发时扫描全部客户端。
  3. TradeCustomTabManagerTradeFunctionSwitch 增加账号维度套利灰度缓存,并在灰度配置变更、账号切换、设置变更时失效。
  4. TradeGuaDanListView.onForeground() 的挂单刷新做去重/节流,避免前台恢复、手动刷新和推送触发重复查询。

验证口径

每个候选项修复后,需要用新包重新采集线上或真机冻屏采样,确认对应函数不再进入 TOP 耗时列表。仅凭本次 TOP10 采样不能判定短函数为唯一根因。