perf: skip redundant composer measurement, cache i18next language codes and follow streaming once per frame
This commit is contained in:
@@ -605,6 +605,38 @@ Renderer 主线程降速 4 倍(Main 不降速,每次 reload 后重新应用
|
||||
低成本热点:Composer 高度改为只在需要时测量、`t()` 结果或 i18next 语言码规范化做缓存、
|
||||
滚动跟随按帧合并且只在贴底时执行。
|
||||
|
||||
#### 2026-10-02 第二步:三处低成本热点
|
||||
|
||||
- **Composer 高度(`App.tsx` `resizeComposerTextarea`):** 记住上次的值与高度。值未变不测量;
|
||||
在原文本末尾追加时不再先设 `height: auto`(只会变高),已到最大高度直接跳过测量;删除、
|
||||
替换、清空仍按原方式重置并测量。
|
||||
- **i18next 语言码(`i18n/index.ts`):** i18next 25 每次 `t()` 都经
|
||||
`toResolveHierarchy`→`formatLanguageCode` 调用 `Intl.getCanonicalLocales`。初始化后对
|
||||
`languageUtils.formatLanguageCode` 加按输入缓存(结果只取决于代码与静态初始化选项,上限
|
||||
64 项),翻译结果不变。
|
||||
- **滚动跟随(`ChatHistoryPane.tsx`):** 激活面板时仍同步滚到底;之后内容更新时改为每帧最多
|
||||
一次 `requestAnimationFrame` 中读取 `scrollHeight` 并 `scrollTo`,回调里再次确认仍贴底;
|
||||
卸载时取消。读者离开底部时不滚动,恢复阅读位置逻辑不变。
|
||||
- **测试:** 新增“流式三次更新只滚动一帧”(旧实现 3 次,失败)、Composer 追加与删除的测量
|
||||
次数、`t()` 不再调用 `Intl.getCanonicalLocales`。全量测试 5,621 通过,2 失败与本改动
|
||||
无关(真实 OpenCode 集成测试因免费额度返回 403;Supervisor 超时设置用例此前已失败)。
|
||||
- **`npm run perf:app` A/B(同机,改动前为临时 worktree 中的 `983cdd4` 构建,交替运行):**
|
||||
|
||||
| 场景(4× 降速,3 轮) | 改动前 按键/点击 p50 / p95 | 改动后 |
|
||||
| --- | --- | --- |
|
||||
| 输入 120 字(新 profile) | 28–80 / 33–361 ms | 19–36 / 24–57 ms |
|
||||
| 输入 120 字(有 300 个会话) | 265–2,372 / 1,486–4,266 ms | 27–161 / 32–346 ms |
|
||||
| 首次切换会话 | 442–761 / 1,063–1,384 ms | 360–398 / 820–1,334 ms |
|
||||
| 再次切换(缓存命中) | 472–749 / 501–1,143 ms | 390–420 / 456–951 ms |
|
||||
| 流式 40 KB:Long Tasks 总时长 | 15.9–20.6 s | 15.1–17.4 s |
|
||||
| 流式期间输入 | 432–6,778 / 1,146–9,634 ms | 96–466 / 297–1,567 ms |
|
||||
|
||||
不降速时(2 轮)两版各场景持平,输入 p95 均约 9 ms,流式 1 个 Long Task。4× 降速下
|
||||
方差很大(同版本轮间可差数倍),应看量级:有历史时输入从秒级回到百毫秒内,切换略有改善,
|
||||
流式本身仍是每帧卡顿——剩余成本是 App 级重渲染与 Markdown/React 提交,需 `PERF-13`。
|
||||
- **剩余:** 流式 delta 按帧合并后以 transition 提交、大面板 memo 仍待实施;之后进入
|
||||
`PERF-13`。
|
||||
|
||||
### PERF-13 Renderer 领域 Store 迁移
|
||||
|
||||
- **优先级 / 状态:** P1 / 待开始
|
||||
|
||||
Reference in New Issue
Block a user