From 82107ad86acb1315bf936270cbacdd182ce4dd84 Mon Sep 17 00:00:00 2001 From: mesalogo Date: Sat, 3 Oct 2026 05:53:33 +0800 Subject: [PATCH] docs: record second parallel performance round --- ...performance-experience-improvement-plan.md | 45 ++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/docs/roadmap/product-performance-experience-improvement-plan.md b/docs/roadmap/product-performance-experience-improvement-plan.md index be089aa3..9b347304 100644 --- a/docs/roadmap/product-performance-experience-improvement-plan.md +++ b/docs/roadmap/product-performance-experience-improvement-plan.md @@ -800,9 +800,52 @@ Renderer 主线程降速 4 倍(Main 不降速,每次 reload 后重新应用 加入滞后窗口后降到 15–16%。剩余开销主要在新行渲染和 `getBoundingClientRect` 测量,后续 可把锚点测量合并到每帧一次,或给 Markdown 结果加缓存。 +#### 2026-10-03 第二轮并行:滚动、Markdown 缓存、侧栏窗口化、App 继续瘦身、活动记录 + +- **滚动(`ChatHistoryPane.tsx`、`chat-message-window.ts`):** 滚动事件只读 `scrollTop` 等 + 滚动容器指标;是否重新取窗改为每帧最多判断一次,并用“锚点行 + 缓存行高”推算视口位置, + 稳定滚动时不读元素几何。提交后只有挂载集合或占位高度变化时才校正锚点;上内边距缓存, + 在 resize、激活和重新取锚点时刷新(真实 Electron 毛玻璃测试曾因缓存旧边距偏 105 px,已修)。 +- **Markdown 渲染缓存(`markdown-render-cache.ts`):** 按源文本和管线配置缓存解析后的 hast + 树(LRU),重新挂载的行跳过 micromark/remark/rehype/KaTeX,只做 hast → React。 +- **侧栏窗口化(`use-conversation-list-window.ts`):** 60 个会话以上只挂载视口附近的行, + 活动会话、菜单、重命名、获得焦点的行保持挂载;`aria-setsize`/`aria-posinset` 保留总数。 +- **App 继续瘦身:** 会话持久化与历史加载(`conversation-persistence.ts`)、刷新调度 + (`conversation-refresh.ts`)、Agent 事件处理(`agent-event-handler.ts`)、历史面板 + (`ConversationHistorySlot.tsx`)移出 App。`App.tsx` 从约 10,960 行降到 9,566 行,lint 上限 + 改为 9,600。 +- **活动记录(`activity-history-plan.ts`):** Main 的整份替换只校验、序列化变化的记录; + 新增增量 IPC `activity-history:update`。Renderer 还没有改用增量接口。 +- **会话读取:** `conversations:list-summaries` 和 `conversations:get` 也改由只读 worker 执行。 +- **`npm run perf:app` 驱动:** 侧栏窗口化后不再一次挂载全部会话,驱动改为按 `aria-setsize` + 判断加载完成,点击会话前逐屏滚动侧栏直到该行挂载。 + +`npm run perf:main`(1,000 个会话 / 2 万条消息 / 5,000 条活动记录,Main 事件循环最大延迟): + +| 路径 | 改动前 | 改动后 | +| --- | --- | --- | +| 会话摘要列表 | 25.4 ms | 0.8 ms(单次耗时 31 ms,在 worker 上) | +| 活动记录整份替换,无变化 | 13.8 ms | 9.3 ms | +| 活动记录增量更新 1 条 | — | 5.3 ms | + +`npm run perf:app`,4× 降速,改动前(`169941c`)与改动后各 3 轮: + +| 场景 | 改动前 | 改动后 | +| --- | --- | --- | +| 滚动长会话:帧 p95 / 掉帧 | 25–50 ms / 10–11% | 17–41 ms / 9–10% | +| 打开 2,000 条消息会话:长任务 / 点击 p95 | 165–170 / 238–247 ms | 97–105 / 211–218 ms | +| 首次切换会话:长任务 / 点击 p95 | 1,969–2,115 / 444–460 ms | 1,256–1,341 / 425–435 ms | +| 切回刚看过的会话:长任务 / 点击 p95 | 1,084–1,183 / 151–158 ms | 152–205 / 110–146 ms | +| 流式输出 40 KB:长任务总时长 / 掉帧 | 1.6–2.4 s / 90–99% | 0.33–0.41 s / 63–72% | +| 流式时打字:长任务 / 按键 p95 | 3.0–3.6 s / 41–48 ms | 0.53–0.64 s / 29–43 ms | +| 有历史时打字:DOM 节点 | 4,382 | 705–719 | + +不降速:全部阈值通过;流式输出和流式时打字的长任务均为 0。上一轮滚动的退化已消除(本轮基线 +已含窗口化,故与 `53b9ecb` 的 17 ms / 7% 不完全可比,帧 p95 在两版中都波动较大)。 + ### PERF-14 状态 -- **优先级 / 状态:** P2 / 进行中(消息时间线已窗口化;侧栏未虚拟化) +- **优先级 / 状态:** P2 / 进行中(消息时间线和侧栏已窗口化;页内查找等限制未解决) - **实施条件:** `PERF-13` 完成会话与消息迁移,行组件 props 已稳定。 - **范围:** 消息时间线和会话侧栏优先;保留滚动位置、跳转、展开状态和“加载更早消息”语义。 替换新面板分两步渲染(`09c415b`);侧栏 5 秒重排状态随侧栏迁出 App。