Pulse Canvas 性能看板

commit ed3ea5db · 2026-07-15 04:25 · machine 109429d5 · 15 核 darwin · 对比上次 07-12 10:42
P0 目标 13/15 达标(2 接近预警,0 未达标) · Gate 24/24 通过;无 high 回归。核心 70/70 · CDP trace 诊断 13/13 · 87 条发现已修 4

告警(规则引擎,按严重度)

INFO 样本波动大,勿单看:LRU 容量后等负载 workspace 常驻堆斜率 内存驻留
本次 0 MB/ws,上次同机 0.1 MB/ws(÷Infinity)
→ 时间类指标单样本方差大;结论以 --repeat N 中位数为准(M1),或重跑确认。 · memory.ws_cycle.post_capacity_heap_slope

关键指标趋势(同机 · 28 次运行,按各指标方向判断)

打字 整数组替换
2 → 2
打字 INP p95
16 → 16 ms
入口 chunk raw
1,380 ↓ 639 KB
LRU 容量后堆斜率
0.1 ↓ 0 MB/ws
主进程 loop-delay p99
32.5 ↑ 33.4 ms
口径:计数类指标机器无关、全局可比;时间类按 machineId 分基线,只比同机趋势。定义 SSOT:perf/metrics.json + perf/program.md刷新:perf:bundleharness start --headless + perf:scenariosperf:dashboard
点开 app 到画布可交互要多久?最慢的一段在哪?改动会不会让它变慢?(D 维 · 8 条 · 已修 0)
P0

关键结果

先看这些,判断该专题是否健康。

应用就绪 北极星
进程启动 → 首窗 dom-ready
337 ms
≤ 500 ms
余量 163 ms
观测✓ 达标
画布首帧
renderer 起点 → Canvas 首次渲染
43 ms
≤ 50 ms
余量 7 ms
观测✓ 达标
Welcome 内容
Welcome 本地内容 ready(D1)
108.5 ms
≤ 500 ms
余量 391.5 ms
观测✓ 达标
P1

分项观测

按维度展开,解释关键结果由哪一段产生。

应用就绪 主进程启动到首窗 ready 3/3 已采
指标当前值目标 / 余量目标状态Gate
进程启动 → whenReady 观测
startup.when_ready_ms · 同机
205 ms ≤ 350 ms
余量 145 ms
✓ 达标
seeding+插件串行链(D2 观测) 观测
startup.serial_chain_ms · 同机
44 ms ≤ 60 ms
余量 16 ms
✓ 达标
进程启动 → openWindow 观测
startup.open_window_ms · 同机
250 ms ≤ 400 ms
余量 150 ms
✓ 达标
画布首帧 Renderer 首屏与 Canvas 首次渲染 1/1 已采
指标当前值目标 / 余量目标状态Gate
renderer FCP 记录
startup.renderer.fcp_ms · 同机
26 ms 待校准 待校准
P2

深入诊断

排障时再看;其中部分指标不参与核心门禁。

画布首帧 Renderer 首屏与 Canvas 首次渲染 1/1 已采
指标当前值目标 / 余量目标状态Gate
导航起点 → renderer main 模块执行点(非纯 compile/eval) 记录
startup.renderer.entry_eval_ms · 同机
14 ms 待校准 待校准
Warm reload 体验 实验室 LCP、CLS 与首画布前阻塞 7/7 已采
指标当前值目标 / 余量目标状态Gate
CDP trace · warm renderer reload LCP(lab) 记录
startup.renderer_reload.lcp_ms · 同机
warm renderer reload · file:// · perf/out/renderer-trace.json.gz · web.dev reference good
184.1 ms ≤ 800 ms
余量 615.9 ms
✓ 达标
CDP trace · warm renderer reload CLS(lab) 记录
startup.renderer_reload.cls · 同机
warm renderer reload · file:// · perf/out/renderer-trace.json.gz · web.dev reference good
0 score ≤ 0 score
余量 0 score
✓ 达标
CDP trace · unexpected layout shift 数 记录
startup.renderer_reload.layout_shift_count · 同机
no unexpected layout shifts observed · warm renderer reload · file:// · perf/out/renderer-trace.json.gz
0 待校准 待校准
CDP trace · FCP→Canvas 壳层 blocking time 记录
startup.renderer_reload.blocking_time_to_canvas_ms · 同机
FCP 28.4ms → canvas 50.9ms
0 ms 待校准 待校准
CDP trace · Canvas→LCP blocking time 记录
startup.renderer_reload.blocking_canvas_to_lcp_ms · 同机
canvas 50.9ms → LCP 184.1ms
0 ms ≤ 50 ms
余量 50 ms
✓ 达标
CDP trace · Canvas 前本地资源 门禁
startup.loaded_to_canvas_kb · 同机
17 local resources completed by first Canvas · warm renderer reload · file:// · perf/out/renderer-trace.json.gz
926.7 KB ≤ 950 KB
余量 23.3 KB
✓ 达标 ✓ PASS ≤ 933
CDP trace · LCP 前本地资源 门禁
startup.loaded_to_lcp_kb · 同机
17 local resources completed by LCP · warm renderer reload · file:// · perf/out/renderer-trace.json.gz
926.7 KB ≤ 950 KB
余量 23.3 KB
✓ 达标 ✓ PASS ≤ 938
Warm reload CPU 脚本、样式与布局耗时 6/6 已采
指标当前值目标 / 余量目标状态Gate
CDP trace · Long Task 数 记录
startup.renderer_reload.long_task_count · 同机
0 tasks · total 0ms · warm renderer reload · file:// · perf/out/renderer-trace.json.gz
0 ≤ 0 次
余量 0 次
✓ 达标
CDP trace · 最大 Long Task 记录
startup.renderer_reload.long_task_max_ms · 同机
0 tasks · total 0ms · warm renderer reload · file:// · perf/out/renderer-trace.json.gz
0 ms ≤ 50 ms
余量 50 ms
✓ 达标
CDP trace · renderer task duration 记录
startup.renderer_reload.task_ms · 同机
warm renderer reload · file:// · perf/out/renderer-trace.json.gz
152.6 ms 待校准 待校准
CDP trace · script duration 记录
startup.renderer_reload.script_ms · 同机
warm renderer reload · file:// · perf/out/renderer-trace.json.gz
45.7 ms 待校准 待校准
CDP trace · recalc style duration 记录
startup.renderer_reload.recalc_style_ms · 同机
warm renderer reload · file:// · perf/out/renderer-trace.json.gz
25.6 ms 待校准 待校准
CDP trace · layout duration 记录
startup.renderer_reload.layout_ms · 同机
warm renderer reload · file:// · perf/out/renderer-trace.json.gz
13.9 ms 待校准 待校准
打字 / 调整尺寸 / 拖拽 / 平移卡不卡?多大画布开始卡?修复 I-1/A2 的收益能不能守住?(A/I/G 维 · 24 条 · 已修 1(A6))
场景条件:@100 节点画布 · 打字 120 字符(25ms 间隔) · 调整尺寸/拖拽各 90 步 · Pan/Zoom 50 wheel/run · repeat 3(时间取中位数并保留 raw,帧另保留单轮最差值)
P0

关键结果

先看这些,判断该专题是否健康。

交互延迟 北极星
打字 INP p95
16 ms
≤ 50 ms
余量 34 ms
观测✓ 达标
交互延迟
拖拽 INP p95
24 ms
≤ 50 ms
余量 26 ms
观测✓ 达标
帧流畅度
调整尺寸 帧超 20ms 占比
0 %
≤ 1 %
余量 1 %
观测✓ 达标
median 0% · max 0% · max 0 frames >20ms
交互延迟
平移/缩放 wheel→下一帧 p95
0.2 ms
≤ 8 ms
余量 7.8 ms
观测✓ 达标
50 wheel samples/run × 3 · transform verified
P1

分项观测

按维度展开,解释关键结果由哪一段产生。

交互延迟 输入、拖拽、调整尺寸与平移缩放的响应时间 1/1 已采
指标当前值目标 / 余量目标状态Gate
调整尺寸 INP p95(仅离散事件,不覆盖连续 move) 记录
interact.resize.inp_p95_ms · 同机
24 ms 待校准 待校准
帧流畅度 各场景超过 20ms 的帧占比 7/7 已采
指标当前值目标 / 余量目标状态Gate
打字 帧超 20ms 占比 观测
interact.typing.frames_over20_pct · 同机
median 0% · max 0% · max 0 frames >20ms
0 % ≤ 1 %
余量 1 %
✓ 达标
打字 单轮最差帧超 20ms 占比 记录
interact.typing.frames_over20_pct_max · 同机
max across 3 active-window runs · 0 frames >20ms
0 % 待校准 待校准
拖拽 帧超 20ms 占比 观测
interact.drag.frames_over20_pct · 同机
median 0% · max 0% · max 0 frames >20ms
0 % ≤ 1 %
余量 1 %
✓ 达标
拖拽 单轮最差帧超 20ms 占比 记录
interact.drag.frames_over20_pct_max · 同机
max across 3 active-window runs · 0 frames >20ms
0 % 待校准 待校准
调整尺寸 单轮最差帧超 20ms 占比 记录
interact.resize.frames_over20_pct_max · 同机
max across 3 active-window runs · 0 frames >20ms
0 % 待校准 待校准
平移/缩放 帧超 20ms 占比 观测
interact.panzoom.frames_over20_pct · 同机
median 0.5% · max 1% · max 2 frames >20ms
0.5 % ≤ 1 %
余量 0.5 %
✓ 达标
平移/缩放 单轮最差帧超 20ms 占比 记录
interact.panzoom.frames_over20_pct_max · 同机
max across 3 active-window runs · 2 frames >20ms
1 % 待校准 待校准
状态更新放大 nodes 数组整组替换守卫 3/3 已采
指标当前值目标 / 余量目标状态Gate
打字 整数组替换次数(I-1 守卫) 门禁
interact.typing.counter.nodes_array_replace · 全局
2 ≤ 5 次
余量 3 次
✓ 达标 ✓ PASS ≤ 10
拖拽 整数组替换次数(A2 守卫) 门禁
interact.drag.counter.nodes_array_replace · 全局
1 ≤ 2 次
余量 1 次
✓ 达标 ✓ PASS ≤ 10
调整尺寸 整数组替换次数(A2 resize 守卫) 门禁
interact.resize.counter.nodes_array_replace · 全局
1 ≤ 2 次
余量 1 次
✓ 达标 ✓ PASS ≤ 10
保存放大 交互过程触发的 Canvas 保存 IPC 2 项接近预警
指标当前值目标 / 余量目标状态Gate
打字 保存 IPC 次数 门禁
interact.typing.counter.canvas_save_ipc · 全局
2 ≤ 1 次
差 1 次
△ 接近预警 ✓ PASS ≤ 3
拖拽 保存 IPC 次数 门禁
interact.drag.counter.canvas_save_ipc · 全局
1 ≤ 1 次
余量 0 次
✓ 达标 ✓ PASS ≤ 3
调整尺寸 保存 IPC 次数 门禁
interact.resize.counter.canvas_save_ipc · 全局
2 ≤ 1 次
差 1 次
△ 接近预警 ✓ PASS ≤ 3
启动要 parse 多少 JS?哪个依赖在启动路径上?懒加载边界会不会被悄悄破坏?(C 维 · 9 条 · 已修 0)
P0

关键结果

先看这些,判断该专题是否健康。

启动入口 北极星
入口 chunk raw
639 KB
≤ 680 KB
余量 41 KB
门禁✓ 达标
Gate ✓ PASS ≤ 654
总体积
JS 总量
5,409 KB
≤ 5,350 KB
差 59 KB
门禁△ 接近预警
Gate ✓ PASS ≤ 5,511
启动静态闭包
启动静态闭包 JS raw
639 KB
≤ 650 KB
余量 11 KB
门禁✓ 达标
Gate ✓ PASS ≤ 654
懒加载边界
WATCHLIST 保持懒加载(mermaid)
保持 true
门禁✓ 达标
Gate ✓ PASS = true
P1

分项观测

按维度展开,解释关键结果由哪一段产生。

启动入口 启动路径直接加载的代码 1 项接近预警
指标当前值目标 / 余量目标状态Gate
入口 chunk gzip 门禁
bundle.entry_gzip_kb · 全局
186 KB ≤ 185 KB
差 1 KB
△ 接近预警 ✓ PASS ≤ 191
启动静态闭包 入口及其静态 imports 实际加载的 JS、CSS 与请求数 4/4 已采
指标当前值目标 / 余量目标状态Gate
启动静态闭包 JS gzip 记录
bundle.startup_js_gzip_kb · 全局
186 KB 待校准 待校准
启动静态闭包 CSS raw 门禁
bundle.startup_css_raw_kb · 全局
107 KB ≤ 115 KB
余量 8 KB
✓ 达标 ✓ PASS ≤ 107
启动静态闭包 CSS gzip 记录
bundle.startup_css_gzip_kb · 全局
19 KB 待校准 待校准
启动静态闭包请求数 记录
bundle.startup_request_count · 全局
2 待校准 待校准
总体积 JS 总量与 chunk 数量 2/2 已采
指标当前值目标 / 余量目标状态Gate
CSS 总量 记录
bundle.total_css_raw_kb · 全局
382 KB 待校准 待校准
chunk 数 记录
bundle.chunk_count · 全局
106 待校准 待校准
主进程产物 Main 与 Preload 的构建输出体积 1/1 已采
指标当前值目标 / 余量目标状态Gate
Main bundle raw 门禁
bundle.main_raw_kb · 全局
518 KB ≤ 550 KB
余量 32 KB
✓ 达标 ✓ PASS ≤ 527
功能首用 扣除启动闭包后的功能首次加载增量资源 6/6 已采
指标当前值目标 / 余量目标状态Gate
File 首用增量资源 记录
bundle.feature_first_load.file_raw_kb · 全局
8 incremental requests
764 KB 待校准 待校准
Chat 首用增量资源 记录
bundle.feature_first_load.chat_raw_kb · 全局
10 incremental requests
405 KB 待校准 待校准
Terminal 首用增量资源 记录
bundle.feature_first_load.terminal_raw_kb · 全局
7 incremental requests
343 KB 待校准 待校准
Graph 首用增量资源 记录
bundle.feature_first_load.graph_raw_kb · 全局
9 incremental requests
198 KB 待校准 待校准
Mermaid core 首用增量资源 记录
bundle.feature_first_load.mermaid_raw_kb · 全局
2 incremental requests
590 KB 待校准 待校准
Module Federation 首用增量资源 记录
bundle.feature_first_load.mf_raw_kb · 全局
1 incremental requests
63 KB 待校准 待校准
发布包分发 DMG 与解压应用体积 2/2 已采
指标当前值目标 / 余量目标状态Gate
arm64 DMG 门禁
package.dmg_mb · 同平台架构
darwin/arm64 · commit d15e6cf7
98.2 MB ≤ 105 MB
余量 6.8 MB
✓ 达标 ✓ PASS ≤ 99
解压 .app 门禁
package.app_unpacked_mib · 同平台架构
darwin/arm64 · commit d15e6cf7
236.5 MiB ≤ 250 MiB
余量 13.5 MiB
✓ 达标 ✓ PASS ≤ 242
发布包载荷 ASAR、native unpacked 与 Electron locales 3/3 已采
指标当前值目标 / 余量目标状态Gate
app.asar 门禁
package.asar_mib · 同平台架构
darwin/arm64 · commit d15e6cf7
45.4 MiB ≤ 50 MiB
余量 4.6 MiB
✓ 达标 ✓ PASS ≤ 46
native unpacked 门禁
package.native_unpacked_mib · 同平台架构
darwin/arm64 · commit d15e6cf7
2.3 MiB ≤ 5 MiB
余量 2.7 MiB
✓ 达标 ✓ PASS ≤ 3
Electron locale 数 门禁
package.electron_locale_count · 同平台架构
darwin/arm64 · commit d15e6cf7
3 ≤ 3 个
余量 0 个
✓ 达标 ✓ PASS ≤ 3
P2

深入诊断

排障时再看;其中部分指标不参与核心门禁。

主进程产物 Main 与 Preload 的构建输出体积 1/1 已采
指标当前值目标 / 余量目标状态Gate
Preload bundle raw 记录
bundle.preload_raw_kb · 全局
20 KB 待校准 待校准
懒加载边界 重依赖是否保持按需加载 1/1 已采
指标当前值目标 / 余量目标状态Gate
入口重依赖探针命中数 记录
bundle.heavy_in_entry_count · 全局
0/6 probes · all watched heavy libraries stay lazy
0 = 0 个 ✓ 达标

Chunk 分布(KB raw)— entry 启动时全量 parse,其余按需

indexentry
639
wardley
589
mermaid.core
554
cytoscape.esm
421
xterm
325
index
277
其余 100 个(懒加载)
2,604

Entry 依赖归因(KB,tree-shake 后/压缩前)— assets/index-DIPWxat2.js

应用自身代码app
854
react-dom
131
wouter
13
react
9
scheduler
4
use-sync-external-store
2
regexparam
1
切过 N 个 workspace、开一天后,内存是回落还是只涨不落?大图画布占多少?(H/L 维 + K-1 · 11 条 · 已修 0)
INFO 样本波动大,勿单看:LRU 容量后等负载 workspace 常驻堆斜率
本次 0 MB/ws,上次同机 0.1 MB/ws(÷Infinity)
→ 时间类指标单样本方差大;结论以 --repeat N 中位数为准(M1),或重跑确认。 · memory.ws_cycle.post_capacity_heap_slope
P0

关键结果

先看这些,判断该专题是否健康。

Workspace 驻留 北极星
LRU 容量后等负载 workspace 常驻堆斜率
0 MB/ws
≤ 0.5 MB/ws
余量 0.5 MB/ws
观测✓ 达标
8 equal-load workspaces × 100 nodes · post-capacity heap 22.5 → 22.6 → 22.6 → 22.7 → 22.7 MB
P1

分项观测

按维度展开,解释关键结果由哪一段产生。

Workspace 驻留 切换与驻留后的堆增长 3/3 已采
指标当前值目标 / 余量目标状态Gate
等负载 workspace 切换循环 JS 堆峰值 记录
memory.ws_cycle.peak_heap_mb · 同机
22.8 MB 待校准 待校准
驻留场景每 workspace 节点数 记录
memory.ws_cycle.nodes_per_workspace · 全局
100 节点 待校准 待校准
切换场景峰值挂载 workspace 数 记录
memory.ws_cycle.peak_mounted_workspace_count · 全局
4 待校准 待校准
媒体解码 大图等媒体资源的解码占用 1/1 已采
指标当前值目标 / 余量目标状态Gate
10×4K 图解码内存(K-1 守卫) 记录
memory.image.decoded_mb · 全局
10×4K · original 457.8 MB · 17.4× reduction
26.4 MB ≤ 30 MB
余量 3.6 MB
✓ 达标
P2

深入诊断

排障时再看;其中部分指标不参与核心门禁。

Workspace 驻留 切换与驻留后的堆增长 1/1 已采
指标当前值目标 / 余量目标状态Gate
LRU 容量后堆样本数 记录
memory.ws_cycle.post_capacity_sample_count · 全局
5 待校准 待校准
进程占用 典型节点规模下的进程常驻内存 1/1 已采
指标当前值目标 / 余量目标状态Gate
100 节点画布稳态 RSS(单点) 记录
memory.n100.total_rss_mb · 同机
run-peak across loop-delay windows (incl ws-cycle; 100-node isolation TODO)
1,149 MB 待校准 待校准
任何时刻 IPC 最多被卡多久、被谁卡?持久化每次写多少字节?(B/E/J 维 · 24 条 · 已修 2(E1、B3))
P0

关键结果

先看这些,判断该专题是否健康。

事件循环 北极星
事件循环延迟 p99(E/J 维总汇)
33.4 ms
≤ 25 ms
差 8.4 ms
观测△ 接近预警
33 个 2s 窗口的最差 p99
P1

分项观测

按维度展开,解释关键结果由哪一段产生。

事件循环 主线程事件循环的典型与最坏延迟 1/1 已采
指标当前值目标 / 余量目标状态Gate
事件循环延迟 max(单次冻结上限) 观测
main.loop_delay_max_ms · 同机
48.6 ms ≤ 100 ms
余量 51.4 ms
✓ 达标
持久化 I/O 画布与会话写入放大 1 项接近预警
指标当前值目标 / 余量目标状态Gate
单次保存写文件数(B3 观测) 观测
main.canvas_save.files_written · 全局
3 ≤ 2 个
差 1 个
△ 接近预警
每 turn 会话持久化字节(J-1 守卫) 门禁
main.session_persist.bytes_per_turn · 全局
26 KB ≤ 32 KB
余量 6 KB
✓ 达标 ✓ PASS ≤ 64
P2

深入诊断

排障时再看;其中部分指标不参与核心门禁。

终端传输 终端等高频进程通信 1/1 已采
指标当前值目标 / 余量目标状态Gate
双终端流式 IPC 条数/秒(E3 标尺) 记录
main.pty.ipc_per_sec · 全局
2 terminals · 430 IPC events · 1801.4 ms
238.7 条/s 待校准 待校准
代码密集的长回复流式时掉不掉帧?流末 mermaid burst 多长?F1/F2 收益守住了吗?(F 维 + K-2~4 · 11 条 · 已修 2(F1/F2、流式批处理))
P0

关键结果

先看这些,判断该专题是否健康。

流式流畅度 北极星
流式期帧超率
0 %
≤ 1 %
余量 1 %
观测✓ 达标
流末收尾
流末 mermaid burst 时长
1.3 ms
≤ 50 ms
余量 48.7 ms
观测✓ 达标
P1

分项观测

按维度展开,解释关键结果由哪一段产生。

渲染放大 Markdown 重渲染与缓存收益 2 项未达标
指标当前值目标 / 余量目标状态Gate
流式 Markdown 渲染次数 门禁
chat.stream.md_render_count · 全局
74 count ≤ 65 count
差 9 count
✗ 未达标 ✓ PASS ≤ 80
流式 UI 提交次数 门禁
chat.stream.commit_count · 全局
74 count ≤ 65 count
差 9 count
✗ 未达标 ✓ PASS ≤ 80
markdown 缓存命中率(F1/F2 守卫) 门禁
chat.stream.md_cache_hit_ratio · 全局
2 hits / 4 settled render opportunities
50 % ≥ 50 %
余量 0 %
✓ 达标 ✓ PASS ≥ 50
settled Markdown 缓存命中数 记录
chat.stream.md_cache_hit_count · 全局
2 待校准 待校准
P2

深入诊断

排障时再看;其中部分指标不参与核心门禁。

渲染放大 Markdown 重渲染与缓存收益 1/1 已采
指标当前值目标 / 余量目标状态Gate
settled Markdown 缓存机会数 记录
chat.stream.md_cache_opportunity_count · 全局
4 待校准 待校准