diff --git a/docs/roadmap/product-performance-experience-improvement-plan.md b/docs/roadmap/product-performance-experience-improvement-plan.md index e8053502..a16ed90b 100644 --- a/docs/roadmap/product-performance-experience-improvement-plan.md +++ b/docs/roadmap/product-performance-experience-improvement-plan.md @@ -668,9 +668,15 @@ Renderer 主线程降速 4 倍(Main 不降速,每次 reload 后重新应用 | 输入 120 字(有 300 个会话) | 27–81 / 35–227 ms | 10–19 / 12–36 ms | | 流式 40 KB:Long Tasks 总时长 | 6.5–20.8 s | 3.6–19.3 s(3 轮中 2 轮约 4–5 s) | | 流式期间输入 | 73–1,808 / 174–3,498 ms | 34–62 / 59–573 ms | -| 打开 2,000 条消息会话 | 1.07–1.80 s | 0.47–0.76 s | +| 打开 2,000 条消息会话(见下方更正) | 1.07–1.80 s,帧 p95 9–42 ms | 0.47–0.76 s,帧 p95 75–1,008 ms | | 首次 / 缓存命中切换会话 | 持平 | 持平 | + **更正(归因):** “改动后”构建包含了当时工作区中另一项未提交的改动——新会话面板分两步 + 渲染(先最后 20 条,首帧后补齐 80 条,后提交为 `09c415b`)。打开长会话的耗时下降主要来自 + 它,而不是流式缓冲;同时补齐那一帧变成长帧,4× 降速下该场景帧间隔 p95 从 9–42 ms 升到 + 75–1,008 ms。输入与流式期间输入的改善来自本步骤。分两步渲染只是过渡,补齐帧的成本需由 + `PERF-14` 虚拟化解决。 + 不降速时(2 轮)各场景持平或略好,流式期间输入 p95 从 15–17 ms 降到 11–12 ms。流式本身在 4× 降速下仍每帧掉帧:剩余成本是行内 Markdown 解析与 KaTeX 渲染,以及每 250 ms 一次的 App 级吸收;切换会话的 App 级重渲染未改善,留给后续领域迁移。 @@ -680,11 +686,27 @@ Renderer 主线程降速 4 倍(Main 不降速,每次 reload 后重新应用 - **基准工具:** `GB_PERF_MODEL_PORT` 可把假模型移到其他端口(例如本机已运行 GoodBuddy 占用 11434 时),隔离 profile 通过 `GOODBUDDY_MODEL_*` 环境变量指向它。 +#### 2026-10-02 其他改动的架构核对 + +对同期其他功能改动按本批次 5 条规则核对(监督者功能除外): + +- **一致:** 剪贴板改为异步读写(`d773f5e`);未保存修改通过 context 上报、记录不进 App state, + 有未保存修改的路由不被缓存淘汰(`43be465`);新会话面板分两步渲染(`09c415b`,过渡方案)。 +- **偏离规则 1:** Story Graph 检索(`e97263c`)仍在 Main 内经 `DatabaseSync` 读取后,在 JS 中 + 逐条 `JSON.stringify` 并按多个关键词匹配,单次成本高于原整句匹配;工具描述又鼓励 Agent + 主动调用,调用次数会增加。纳入 `PERF-15`/`PERF-16`,在此之前补测检索耗时并限制扫描规模。 +- **偏离规则 2:** 侧栏 5 秒重排(`ee4eb73`,`use-conversation-list-order.ts`)由 App 持有状态, + 渲染期间 setState,定时器每 5 秒检查;顺序不变时跳过,当前成本低。交互上悬停、滚动、菜单 + 打开时不重排。侧栏迁移和虚拟化(`PERF-13`/`PERF-14`)时移入侧栏组件。 +- **React 规则:** 缓存会话保持滚动位置(`bf6c4a9`)在渲染期间写 ref,即当前 lint 的 3 条 + `react-hooks/refs` 错误;启用 React Compiler 前需改为由状态派生顺序。 + ### PERF-14 长列表虚拟化 - **优先级 / 状态:** P2 / 待开始 - **实施条件:** `PERF-13` 完成会话与消息迁移,行组件 props 已稳定。 - **范围:** 消息时间线和会话侧栏优先;保留滚动位置、跳转、展开状态和“加载更早消息”语义。 + 替换新面板分两步渲染(`09c415b`);侧栏 5 秒重排状态随侧栏迁出 App。 - **验收:** 5,000 条消息和 1,000 个会话场景下 DOM 节点数有界,滚动与切换指标改善。 ### PERF-15 存储接口异步化 @@ -692,14 +714,17 @@ Renderer 主线程降速 4 倍(Main 不降速,每次 reload 后重新应用 - **优先级 / 状态:** P1 / 待开始 - **范围:** 在原进程内把 `AssistantDatabase`、`KnowledgeDatabase` 等对外接口改为异步, 调用方全部 `await`;会话列表只返回摘要,搜索下推到 SQL,活动记录改为增量追加。 + 远程 Runtime 实时事件改用已有的 `appendRemoteTaskEventsBatch` 批量写入,不再逐条同步事务。 + Story Graph 检索先补测耗时,扫描规模设上限,匹配尽量下推到 SQL。 - **验收:** 行为与测试不变;`PERF-11` Main event-loop 延迟不变差。 ### PERF-16 数据进程 - **优先级 / 状态:** P1 / 待开始 - **实施条件:** `PERF-15` 完成,调用方已全部异步。 -- **范围:** 新增独占 SQLite 的 `utilityProcess`,承接会话、知识库、向量检索、Story Graph、 - 活动记录及文档解析;Main 只转发;保证同一时刻只有一个写入方。吸收 `PERF-06` 的范围。 +- **范围:** 新增独占 SQLite 的 `utilityProcess`,承接会话、知识库、向量检索、Story Graph + (含 Agent 主动调用的检索)、远程 Runtime 事件持久化、活动记录及文档解析;Main 只转发; + 保证同一时刻只有一个写入方。吸收 `PERF-06` 的范围。 - **验收:** 大知识库检索、会话列表和文档导入期间 Main event-loop 延迟达到批次目标;取消、 崩溃恢复和迁移语义不回退。