diff --git a/docs/roadmap/product-performance-experience-improvement-plan.md b/docs/roadmap/product-performance-experience-improvement-plan.md index a114602d..30cc8410 100644 --- a/docs/roadmap/product-performance-experience-improvement-plan.md +++ b/docs/roadmap/product-performance-experience-improvement-plan.md @@ -866,6 +866,35 @@ Renderer 主线程降速 4 倍(Main 不降速,每次 reload 后重新应用 | 页内查找覆盖未挂载的消息 | 当前 App 没有页内查找功能(未调用 `findInPage`),属于新功能,不是回归 | | 性能阈值接入 CI | 仓库目前没有 CI 工作流;`npm run perf:check` 可以在本地运行 | +### 7.2 按性能原则补齐差距(2026-10-03,第三轮并行) + +统一标准见 `docs/architecture/performance-principles.md`(P1–P9、性能预算和评审清单)。本轮按其中“当前差距”并行推进: + +| 原则 | 改动 | 测量结果 | +| --- | --- | --- | +| P1 | 文档解析、PPTX 提取、分块、大文件(≥ 1 MiB)哈希移到 `document-parse-worker` 线程,FIFO 队列;worker 不可用或崩溃时退回原来的 Main 内联执行,30 秒后重试;中止正在执行的任务会终止 worker。数据库写入仍由调用方按原顺序执行 | `npm run perf:document-parse`,各 3 轮:Main 最长阻塞 large.pdf 498–679 → 16–17 ms,large.docx 313–335 → 17–20 ms;总耗时基本不变 | +| P3 | 终端输出:Main 端按 8 ms 窗口合并(空闲时第一块立即发出,不增加回显延迟),单批不超过 64 KiB;控制事件(退出、错误、状态)发出前先清空缓冲,顺序不变;背压按“已发出 + 已缓冲”字节计算,暂停阈值留 1/4 余量。Renderer 端每帧最多写一次 xterm,写完后按最大序号累计 ACK;窗口不可见时 100 ms 定时兜底,保证 ACK 不中断 | 单元测试覆盖顺序、UTF-8 边界、背压、退出前清空;`perf:app` 未覆盖终端场景 | +| P5 | 笔记列表(按卡片行窗口化,CSS subgrid)、工作区文件树(展开后拍平,按缩进显示层级)、知识库文档表格只渲染可见部分;抽出通用 `use-list-window` / `use-grid-columns`,侧栏会话列表改用同一实现。选中项、打开菜单的行、焦点行保持挂载 | 每个列表新增窗口化单元测试;真实 Electron 文件树布局测试改为验证窗口化后的停靠、滚动和预览返回 | +| P6 | Main 启动打点(`startup-marks.ts`),新增 `npm run perf:startup`:首次运行 / 空配置 / 300 个会话三种配置,各 5 轮 | 见下表 | +| P9 | `package.json` 新增 `perf:startup`、`perf:document-parse` | — | + +冷启动基线(标准机,中位数 / p95,ms): + +| 阶段 | 首次运行 | 空配置 | 300 个会话 | +| --- | --- | --- | --- | +| 启动到输入框可用 | 1284 / 1322 | 1024 / 1040 | 1028 / 1040 | +| Main 模块加载(index.js 求值) | 414 / 420 | 411 / 420 | 413 / 423 | +| 本地工具环境初始化 | 154 / 169 | 160 / 163 | 153 / 160 | +| 知识库初始化 | 240 / 249 | 19 / 22 | 32 / 42 | +| 助手数据库初始化(同步) | 205 / 206 | 4 / 4 | 14 / 15 | +| Renderer 导航到输入框出现 | 228 / 233 | 226 / 244 | 224 / 228 | + +启动的主要开销是 Main 模块加载(约 415 ms)和本地工具环境初始化(约 155 ms);首次运行另有约 450 ms 的建库开销。这些只做了测量,没有改动,后续按 P6 拆分延迟加载。 + +本轮回归:`perf:app` 60 项阈值全部通过(不降速,流式和流式打字长任务均为 0);typecheck、全量 lint 通过;全量测试中 2 个失败分别为 OpenCode 免费额度 403 的集成用例和 `magic-notes-*` 真实 Electron 测试在整套并行负载下的偶发失败,后者单独运行和 6 个 Electron 布局测试并行连跑 3 次均通过。 + +修复记录:文件树窗口化最初以 `.assistant-sidebar__body` 为滚动容器,但真实布局中滚动的是停靠的 `.workspace-files__files-view`,真实 Electron 测试发现后改为优先使用后者。 + ### PERF-14 状态 - **优先级 / 状态:** P2 / 进行中(消息时间线和侧栏已窗口化;页内查找等限制未解决)