ethanreedlabs/sulde/perf-diagnose
Claude Code and agent skill by ethanreedlabs/sulde
- community
Checking that the SKILL.md file is still in the repository.
性能诊断 / 慢 / 卡 / 延迟 / 优化 / 提速 / 卡顿 / jank / lag / 为什么这么慢 / 进场慢 / 加载慢 / 响应慢 / 抖动 / 掉帧 / 内存 / OOM — 在写任何 fix 之前先用工具测量,产出多维诊断报告。当用户或 Dev 说"慢/卡/延迟/优化/提速/卡顿/抖动/掉帧"时自动触发。禁止跳过直接猜根因。stack 中性 — profiler 命令 / 指标阈值 / 平台模式从 references/{stack}.md 读。
Install
npx vskill@latest install ethanreedlabs/sulde/perf-diagnoseSKILL.md
性能诊断(Measure First 强制)
核心原则:Measure First,禁止 Guess First。
在产出任何假说或 fix 建议之前,必须先用工具测量。诊断 skill 只产出带实测数据的诊断报告,不写 fix(fix 由协调端 review 诊断报告后另行派 task)。
stack 决定后必先 Read 对应 references(profiler 命令 / 指标阈值 / 平台特定模式全在那里):
| Frontend stack | 必 Read | |
|---|---|---|
mobile-android | references/android.md | |
mobile-ios | references/ios.md | |
mobile-flutter | references/flutter.md | |
mobile-harmony | references/harmony.md |
完整 SOP 见<docs-hub>/00_shared-rules/perf-diagnosis.md(若项目有三端共享真值)
§1 perf-gate 触发词(自动激活)
以下词命中任一即必须走本 skill,不许跳过直接给 fix:
判定线(违一即不合格):
- ❌ 接受"假说星级 ⭐⭐⭐⭐⭐"作为诊断证据
- ❌ 没跑 profiler 就写 fix 建议
- ❌ 自加"防御性 sleep / debounce / delay"未经实测
- ❌ 仅靠
System.currentTimeMillis()/NSLog T0~T4打点当完整诊断数据 - ❌ 跑完 profiler 顺手写 fix(诊断和 fix 必须分开 — 见 §7)
§2 思考模式(强制)
执行 `/perf-diagnose` 时必须启用 think hard 深度思考。性能问题易被表面症状误导,必用结构化思考:
§3 Step 1:确认问题边界
先问用户(用 AskUserQuestion,同时问):
- 问题类型(单选):
- 滚动卡顿 / jank / 抖动(列表不流畅)
- 启动慢 / 进场慢(点击 → 看到内容)
- 内存增长 / OOM / 崩溃
- 网络慢 / 接口超时
- 动画掉帧(transition / 进出场动画)
- 其他(描述)
- 是冷启动还是每次都慢?(或:cache miss 还是 cache hit 都有?)
- 真机型号 + 系统版本?
- 大致严重程度(用户感知描述,例:滚 5 秒明显卡 2 次)
§4 Step 2:按问题类型运行诊断套件
根据 Step 1 答案选对应组合,优先跑自动化方案,GUI 方案作补充或深入分析用。
各 stack 的工具映射见 references/{stack}.md §2 工具速查表。通用维度:
| 维度 | 通用语义 | 工具入口(详 references/{stack}.md) | |
|---|---|---|---|
| CPU / 调用栈 | 火焰图 / 时间轮廓 | §2.1 | |
| 自定义时间线标记 | 代码插桩 + profiler 对齐 | §2.2 | |
| 帧率量化 | P50 / P90 / P99 帧耗时 + jank 比例 | §2.3 | |
| 帧流水线底层 | 渲染合成层延迟 | §2.4 | |
| 启动时间 | 冷 / 温 / 热三态 | §2.5 | |
| 启动链路 | pre-main / main / 首帧 | §2.6 | |
| 内存分配(JVM / Heap) | 对象数 / retained size | §2.7 | |
| Native 内存 | 底层 alloc 来源 | §2.8 | |
| 内存泄漏 | retain cycle / 实例数 | §2.9 | |
| 主线程 IO 检测 | DiskRead / Network on main | §2.10 | |
| 网络瀑布 | DNS / Connect / SSL / Wait / Receive | §2.11 | |
| 过度绘制 / 视图层级 | overdraw / 层叠数 | §2.12 | |
| 性能回归防护 | 持续 benchmark | §2.13 |
§5 关键指标阈值(stack 通用语义)
各 stack 的具体工具 + 指标读法见 references/{stack}.md §3。通用阈值参考:
| 指标 | 良好 | 警告 | 严重 | |
|---|---|---|---|---|
| P50 帧耗时 | < 8ms | 8~12ms | > 16ms | |
| P90 帧耗时 | < 12ms | 12~16ms | > 20ms | |
| P99 帧耗时 | < 16ms | 16~25ms | > 30ms | |
| Jank 比例 | < 1% | 1~5% | > 5% | |
| 主线程最大 spike | < 16ms | 16~50ms | > 100ms | |
| 冷启动时间 | < 1.5s | 1.5~2.5s | > 3s | |
| 热启动时间 | < 500ms | 500~800ms | > 1s | |
| 单次接口延迟(WiFi) | < 300ms | 300~800ms | > 1.5s | |
| 内存峰值(中端机) | < 200MB | 200~350MB | > 500MB |
P99 > 16ms = 用户能感知的 jank;Jank 比例 > 5% = 体验严重劣化。
§6 Step 3:写诊断 handoff
路径:.ai-workspace/handoff/{YYYY-MM-DD}-{slug}-diag.md(类型 1 跨终端 handoff)
§6.1 必含段(缺一即不合格)
§6.2 自检(提交 handoff 前)
- [ ] handoff 含实测数值(ms / fps / MB / %),不是"大概"/"感觉"
- [ ] 至少 1 张 flame chart / time profiler 截图或 trace 文件存在
- [ ] Top-3 耗时来源都有工具证据(不是 logcat 打点推断)
- [ ] 帧率指标(Jank 比例 + P99)已记录
- [ ] 排除项列出至少 1 个已测但排除的候选
- [ ] fix 后复测路径已写(指标 + 工具 + 阈值 + 基线数值)
- [ ] 没有绕过测量直接写 fix 代码
- [ ] handoff 路径在
.ai-workspace/handoff/且文件名带-diag
§7 Step 4:告知协调端(不在本 skill 写 fix)
handoff 写完后,回话给用户:
「诊断报告已写到.ai-workspace/handoff/{YYYY-MM-DD}-{slug}-diag.md,含实测数据 + Top-3 耗时 + 排除项 + fix 方向建议。请把 handoff 交给协调端,协调端基于诊断数据写 fix task md。」
本 skill 到此结束。
铁律:Dev 诊断完不直接动手 fix,等协调端审核诊断报告后通过 /assign 派 fix task。这避免:
- 诊断证据不足就改代码,治标不治本
- 多个 candidate root cause 没充分对比就修了次要的
- 协调端无法基于诊断报告做跨端反模式登记
§8 与其他 skill 衔接
§8.1 与 /crash-fix 区别
| 维度 | /perf-diagnose | /crash-fix | |
|---|---|---|---|
| 触发 | 慢/卡/延迟(运行正常但慢) | 闪退/异常/编译错误(运行失败) | |
| 输出 | 诊断报告(带数据) | 修复代码 + 验证 | |
| 后续 | 协调端派 fix task | 直接 commit |
崩溃同时伴随性能问题 → 先 /crash-fix 稳定运行,再 /perf-diagnose 测性能。
§8.2 与 /postmortem 衔接
fix task 完成后(协调端派的 fix 跑完),协调端必跑 /postmortem:
- Q1 这次性能问题以前踩过类似 pattern 吗?(grep 反模式集合)
- Q2 会再踩吗?(同模块 / 同 stack)
- Q3 能不能 lint 化?(eg. 主线程 IO 检测自动化)
- Q4 其他 frontend 也有吗?(跨 stack 复制检查)
诊断 skill 不直接跑 postmortem,但诊断报告的"排除项 + fix 方向"应足以让 postmortem 提取 pattern。
§9 反例(禁止)
❌ "感觉是主线程 inflate 太多" → 没跑 Profiler 就写假说 ❌ "778 条 label 性能差 ⭐⭐⭐" → 星级置信度替代实测 ❌ "fullScreenCover 链重建 ⭐⭐⭐⭐⭐" → 同上 ❌ 只用 System.currentTimeMillis() / NSLog T0 打点 → 只测时间段不显示 CPU 干了什么 ❌ 看 SharedPrefs / UserDefaults 内容推断"数据量大性能差" → 不是 Profiler 数据 ❌ 跑完 Profiler 顺手写了 fix → 诊断和 fix 必须分开(§7) ❌ 诊断 handoff 没有"排除项"段 → 协调端无法判断诊断完整性 ❌ 自加 sleep / debounce / delay 当 fix → 未经实测无法证明有效
§10 示例
Security
- Security scanPassed, 90 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/dev/perf-diagnose/SKILL.md
Popularity
- Repository stars
- 101
- 7-day trend score
- 23
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/ethanreedlabs/sulde/perf-diagnose)