40 lines
3.8 KiB
Markdown
40 lines
3.8 KiB
Markdown
# 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. 在 `TradeCustomTabManager` 或 `TradeFunctionSwitch` 增加账号维度套利灰度缓存,并在灰度配置变更、账号切换、设置变更时失效。
|
|
4. 对 `TradeGuaDanListView.onForeground()` 的挂单刷新做去重/节流,避免前台恢复、手动刷新和推送触发重复查询。
|
|
|
|
## 验证口径
|
|
|
|
每个候选项修复后,需要用新包重新采集线上或真机冻屏采样,确认对应函数不再进入 TOP 耗时列表。仅凭本次 TOP10 采样不能判定短函数为唯一根因。
|