35 lines
4.0 KiB
Markdown
35 lines
4.0 KiB
Markdown
# 设置打开延迟诊断(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。
|
||
|
||
本轮只运行隔离诊断,没有生产实现变更,因此未重跑构建或业务回归。最终优化效果需修改后以同样口径重新测量首开、关闭重开、导航切换和实际内容绘制,并验证表单状态、主题和设置数据刷新。
|