Files

91 lines
7.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# TOP10 线上耗时函数后续修复
## 修复提交
| 仓库 | 分支 | Commit ID | 说明 |
| --- | --- | --- | --- |
| `harmony-ths-futures` | `work-20260818-clz-FUHM-1979-apm-appfreeze` | `0d10cf71a01c8c5d875ca4c950d6d2fd71d3fd42` | 挂单请求合并、套利开关缓存、通信队列索引、行情表格延迟合并 |
| `ohos_mobile_lib_communication` | `work-freeze-lib-communication-1.1.1` | `031d4cf221b4da6d9aaf2db443ba293559a0d4a5` | `QueueManagement` 队列索引(instanceId→client / companion |
## 问题来源
基于 2026-08-21 `TOP10耗时函数列表.md` 的线上采样,继续处理仍有明确优化空间的主线程热点:
- `@b2b/hq_table` `TableDataSource`:1 次故障、10 次调用、总耗时 3000ms。
- `@kernel/lib_communication` `QueueManagement`:1 次故障、2 次调用、总耗时 600ms。
- `biz_trade` `TradeCustomTabManager.isArbitrageEnabled()`:1 次故障、4 次调用、总耗时 1200ms。
- `biz_trade` `TradeGuaDanListView.onForeground()`:1 次故障、10 次调用、总耗时 3000ms。
## TOP20 线上数据补充
同日 `/Users/clz/Downloads/TOP20耗时函数列表.md` 汇总数据如下:故障出现次数 `1134`,调用次数 `11340`,记录总耗时 `3402000ms`。所有记录的单个故障最大耗时均为 `3000ms`。这些数值是采样记录的分层汇总,不代表一次冻屏实际耗时,不能直接相加计算收益。
TOP20 主要归并为以下调用链:
| 调用链 | TOP | 故障/调用 | 总耗时 | 当前判断 |
| --- | ---: | ---: | ---: | --- |
| 重登录复用 IP 与 Native 锁 | 14、1920 | 75/75044/440 | 900000ms132000ms/项 | 锁优化 SO 已接入,应用侧仍有同步查询边界,待新包复采 |
| 交易请求拦截与发送 | 56、1118 | 4767/470670 | 141000201000ms/项 | 已移除拦截器同步状态检查,通用请求仍需观察并发放大 |
| 通信响应回调转发 | 710 | 5859/580590 | 174000177000ms/项 | 属同一管线分层采样,Worker/索引优化已接入,待新包复采 |
TOP20 显示的交易 SDK 与通信库版本分别为旧版 `1.0.11/1.1.1``1.1.1-beta.1`;当前工程依赖已更新为交易 SDK `1.0.13/1.2.0` 及 Worker 优化通信 HAR。因此本表用于记录线上问题来源和修复映射,不能作为当前版本仍全部复现的证据。
## 修复内容
1. `GuaDanViewModel.sendRequest()` 增加进行中请求合并:挂单查询未返回时,后续前台/刷新触发只记录一次尾随刷新,避免短时间重复进入 SDK 查询链路。
2. `TradeCustomTabManager.isArbitrageGrayOpened()` 增加当前账号维度缓存;`TradeSettingEvents.SETTING_UPDATE` 触发时失效,避免列表构建高频进入 `GrayTestManager.isFeatureEnable()` 的日志和配置序列化路径。
3. 通信 SDK `QueueManagement` 增加 `instanceId -> client` 和 companion 映射索引,`getNetworkClient()` 从全量扫描改为按索引取主请求和 companion 请求。
4. `hq_table_20260616.har``TableDataSource` 对非可见区 `SendableRow` 做延迟合并:当前刷新只合并可见行,非可见行缓存到 `pendingSendableRows`,滚动取数时再落到 `RowData`
## 影响范围
- 挂单列表前台恢复、手动刷新和交易推送叠加时的请求频率。
- 独立交易页期权/套利 Tab 显示判断。
- 通信响应分发中的请求匹配。
- 行情表格 Sendable 数据进入主线程后的行合并时机。
业务协议、接口签名、表格展示数据结构和交易请求返回处理不变。挂单请求合并保留尾随刷新,避免丢掉进行中期间发生的最后一次刷新诉求。
## 验证与压测
- `node claude_tool/subthread-import-guard/check-subthread-imports.mjs`PASS。
- 通信 SDK`devecocli build --modules lib_communication@default`BUILD SUCCESSFUL。
- 主工程:`./claude_tool/claude_compile.sh`BUILD_SUCCESS。
- 模拟器:Pura 90`127.0.0.1:5555`HarmonyOS 6.1.1(24)。
- `devecocli run --module entry --device 127.0.0.1:5555 --product default --build-mode debug --skip-build`:安装并启动成功。
- 应用进程 `com.hexin.plat.hmn.futures` 存活,前台任务 `EntryAbility` 存在。
- 前后台压力:Home/重新拉起 20 轮完成,无 crash、无 `APPFREEZE` 日志。
- UI 基础场景:行情 Tab 切换、行情页上下滑动 8 轮、交易 Tab 切换、交易入口前后台 5 轮完成,无 crash、无 `APPFREEZE` 日志。
- 备注:未登录交易账号,挂单真实请求返回链路未覆盖;本轮覆盖交易入口页加载和前台恢复基础路径。
- 临时 stdin 压测脚本未落盘,覆盖 100000 个通信实例索引查询、100000 行表格 Sendable 延迟合并、1000 次挂单刷新触发合并:
- `queueIndexedMs`: 4ms
- `tableDeferredMs`: 4ms
- `requestRealSendAfter1000Triggers`: 2
### 真实账户验证
- 通过 `devecocli ui` 完成控件树检查和交互。
- 真实账户登录成功,交易首页权益、可用资金和行情盘口加载完成。
- 进入当日委托/挂单页面,连续 10 轮切换挂单、委托、成交并触发刷新;页面保持响应,无 `APPFREEZE`,无应用 crash。
- 该轮未执行下单、撤单或改价,避免产生真实资金业务副作用。
- 设备网络不可用时出现 DNS/监控上传错误;同时观察到已有 SQLite 空表名查询错误,均未导致应用退出或冻屏,不纳入本次 TOP 修复结论。
- 最后一次误触打开交易时间提醒 WebView,页面仍正常展示;该路径不属于本次交易 SDK 压测范围。
### Wukong 滑动压力验证
- 设备:Mate X7`127.0.0.1:5557`;仅允许 `com.hexin.plat.hmn.futures`,固定种子 `20260821`
- Wukong 随机测试报告:`task status=success``task time=149s``task count=100`,事件为 100 次滑动;点击、键盘、旋转和应用切换比例均为 0。
- Wukong 异常统计为空;设备 `APPFREEZE` 查询为空,应用 crash 查询为空。
- 报告目录:`/data/local/tmp/wukong/report/20260821_152309/`。该轮未执行交易点击,真实账户无资金业务副作用。
### 按修改点专项复验
- `hq_table`:国内行情大表执行 Wukong 50 次纯滑动,报告 `task status=success``task count=50`、滑动事件 50 次、异常为空;页面仍可正常进入合约详情。
- Worker 解码:合约详情连续 8 轮切换分时、日 K、1/5/15 分钟,图表和行情数据正常,无 `APPFREEZE` 或 crash。
- `GuaDanViewModel``QueueManagement`:真实账户交易页在设置更新后重新进入当日委托,连续 5 轮切换挂单/委托并刷新;页面正常,无 `APPFREEZE` 或 crash。
- `TradeCustomTabManager`:当前真实账户和灰度环境未展示期权/套利独立下单 Tab,仅触发交易设置更新事件并返回交易页验证回退/重建路径;期权/套利 Tab 的直接专项验证待灰度开放后补测。
## 后续验证
需要用新包重新采集线上或真机冻屏采样,确认 `TableDataSource``QueueManagement``isArbitrageEnabled``TradeGuaDanListView.onForeground` 不再进入 TOP 耗时函数。短函数如 `ColorUtils.transFormServerColor()``StringUtil.isNumber()``BaseView` 绘制闭包仍应结合完整栈判断,不单独做微调。