3.8 KiB
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绘制/布局闭包本身都较短,当前不应只针对短函数微调,应先定位其上层列表刷新、图表刷新或交易请求链路。
建议修复顺序
- 在
hq_table源码侧优化TableDataSource.notifyDataSetChanged():减少全量行合并、只更新可见区、批量合并notifyChange(),必要时将可 Sendable 的数据预处理继续前移到子线程。 - 在通信 SDK 源码侧重构
QueueManagement索引:新增instanceId -> clients和 companion 映射,保留原公开接口,避免响应分发时扫描全部客户端。 - 在
TradeCustomTabManager或TradeFunctionSwitch增加账号维度套利灰度缓存,并在灰度配置变更、账号切换、设置变更时失效。 - 对
TradeGuaDanListView.onForeground()的挂单刷新做去重/节流,避免前台恢复、手动刷新和推送触发重复查询。
验证口径
每个候选项修复后,需要用新包重新采集线上或真机冻屏采样,确认对应函数不再进入 TOP 耗时列表。仅凭本次 TOP10 采样不能判定短函数为唯一根因。