Files
ycode/docs/设置打开延迟诊断-2026-10-18.md
T

35 lines
4.0 KiB
Markdown
Raw 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.
# 设置打开延迟诊断(2026-10-18)
用户反馈点击设置后约 1 秒才显示。本轮只诊断,未修改生产代码、未重启或注入用户当前 YCode、未读取/改写真实账户配置。没有查看 WorkBuddy,此任务不需要原版取证。
当前代码会在首次打开和每次关闭后重新创建设置 BrowserWindow,再加载主界面使用的同一份 index.html;设置关闭即销毁。renderer 的条件分支发生在 App 与 SettingsWindow 静态导入后,因此设置窗口仍会解析、执行包含主界面依赖的公共入口。当前生产入口 JS 为 5,016,896 字节,公共 CSS 为 3,424,320 字节。相关位置:`src/main/index.ts:268`、`src/renderer/src/main.tsx:3`、`src/renderer/src/components/SettingsDialog.tsx:81`。
诊断使用 GPU 开启的隔离真实 Electron 实例,加载现有 out 构建、真实 preload/IPC、本地独立数据目录。两轮不启用 tracing 的 11 次新窗口打开(包含首次打开、关闭重开、不同设置页和真实账户菜单“设置”点击)结果如下。时间从发起打开到对应事件,FCP 是浏览器首次内容绘制,不能等同所有控件和数据全部就绪。
| 指标 | 实测 |
| --- | --- |
| 原生窗口 show | 288~652 ms,平均 399 ms |
| 首次内容绘制 FCP | 327~708 ms,平均 474 ms |
| 真实账户菜单“设置”点击→FCP | 452 ms;菜单点击后约 14 ms 请求已发出并开始加载 |
| 已打开窗口重复 show/IPC 返回 | 约 0.7~1.1 ms;不代表切换页内容已经完成绘制 |
| 首屏 config/workspace/appInfo/models/workspaces 的 IPC 处理 | 单项约 0.01~1.17 ms;未阻塞窗口创建及页面加载 |
另一次开启 tracing 的诊断用于定位阶段,不能与未启用 tracing 的样本混算。首个设置渲染进程中,入口模块编译约 63 ms、模块执行约 98 ms,公共 CSS 解析约 19 ms;其余还有渲染进程/上下文启动、文件加载、布局及绘制。trace 中 V8 的细分事件有嵌套,不能将所有 Parse/Compile 行相加当作总耗时。原生 ready-to-show/show 还会早于 React 内容的首次绘制,存在几十至一百多毫秒的无内容窗口阶段。
结论:主要延迟是每次重走完整页面启动链路,且入口携带不属于设置的代码与样式。首屏数据读取不是本次隔离测量中的主要瓶颈;菜单中没有人为等待 1 秒的逻辑。用户所述精确 1 秒未在其当前窗口直接复现,隔离样本有明显波动,不能将 1 秒当作固定测量结果。
建议修复边界:
1. 设置使用独立 renderer 入口,仅加载设置需要的 React、基础主题和导航样式;分离主界面的聊天、Markdown、工具及工作台依赖,设置子页按需加载。
2. 调整设置窗口生命周期,关闭后可复用,必要时在主窗口空闲后预加载。复用时同步最新配置与导航目标,明确清理临时编辑/错误状态,避免旧数据或意外保留未保存表单。保留显式退出时销毁与现有 IPC 归属校验,并相应调整当前“关闭后新建窗口”的测试约定。
3. 首次加载保留可立即绘制的窗口壳/占位;不能只提前 show 一个白色窗口来声称优化完成。配置读取继续异步,不阻塞窗口壳。
证据位置:
- `.tmp/settings-latency-CicVg0/report.json`:第一轮未开启 tracing,5 次新窗口、1 次已有窗口复用。
- `.tmp/settings-latency-R7szKf/report.json`:第二轮未开启 tracing,6 次新窗口(含菜单入口)、1 次已有窗口复用。
- `.tmp/settings-latency-H2wSPl/trace.json`、`analysis.json`、`report.json`:独立跟踪样本。
- `.tmp/measure-settings-latency.cjs`、`.tmp/analyze-settings-latency.cjs`:隔离诊断与 trace 聚合脚本,仅用于 YCode。
本轮只运行隔离诊断,没有生产实现变更,因此未重跑构建或业务回归。最终优化效果需修改后以同样口径重新测量首开、关闭重开、导航切换和实际内容绘制,并验证表单状态、主题和设置数据刷新。