关于 performance-profiling
用于通过针对性分析和测量诊断、改善 Apple 应用性能的技能。它帮助开发者为卡顿、内存增长、启动延迟、能耗及网络浪费等问题选择分析流程。
主要功能
- 01按问题选择分析工具的指南
- 02CPU、内存、启动与能耗参考
- 03设备及 Release 构建分析建议
- 04修复前后测量流程
- 05Xcode 诊断与 MetricKit 指引
适用场景
- 01追踪界面卡顿或 CPU 占用过高
- 02调查内存泄漏与持续增长
- 03测量应用启动缓慢
- 04评估电池、热状态或网络开销
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mengto/ skills --skill performance-profiling安装后在 Claude Code 中输入/performance-profiling确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
agents/openai.yamldemo/expected-output.mdindex.htmlinput.mdPROMPT.mdreferences/energy-diagnostics.mdlaunch-optimization.mdmemory-profiling.mdtime-profiler.md详细介绍
性能分析
使用此技能系统地诊断 Apple 应用的性能问题,选择合适的分析工作流,实施有针对性的修复,并通过实际测量验证更改。
决策树
更改代码前,请选择参考文件:
What performance problem are you investigating?
+ App hangs, stutters, dropped frames, slow UI, high CPU
-> Read references/time-profiler.md
+ High memory, leaks, OOM crashes, growing footprint
-> Read references/memory-profiling.md
+ Slow cold launch, warm launch, resume, or time to first frame
-> Read references/launch-optimization.md
+ Battery drain, thermal throttling, background energy, network waste
-> Read references/energy-diagnostics.md
+ General "app feels slow"
-> Start with references/time-profiler.md, then references/memory-profiling.md
+ Pre-release performance audit
-> Read all reference files and use the review checklist below
快速参考
| 问题 | Instruments/工具 | 关键指标 | 参考 |
|---|---|---|---|
| UI 卡顿超过 250 ms | Time Profiler + Hangs | 卡顿时长、主线程堆栈 | references/time-profiler.md |
| CPU 使用率高 | Time Profiler | 各函数的 CPU 百分比、调用树权重 | references/time-profiler.md |
| 内存泄漏 | Leaks + Memory Graph | 泄漏字节数、保留环路径 | references/memory-profiling.md |
| 内存增长 | Allocations | 存活字节数、代际分析 | references/memory-profiling.md |
| 启动缓慢 | App Launch | 首帧时间、main 前、main 后 | references/launch-optimization.md |
| 电池耗电 | Energy Log | 能耗影响、CPU/GPU/网络活动 | references/energy-diagnostics.md |
| 温度问题 | Activity Monitor、Instruments | 温度状态变化 | references/energy-diagnostics.md |
| 网络开销 | 网络分析器 | 冗余请求、负载大小 | references/energy-diagnostics.md |
工作流
- 根据用户报告、跟踪记录、日志或代码路径确定性能问题类别。
- 除非问题范围较广或不明确,否则只阅读匹配的参考文件。
- 尽量使用 Release 构建在真实设备上进行分析,并采用有代表性的数据。
- 提出修复方案前,检查分析结果指出的代码路径。
- 采取能解决已测量瓶颈的最小针对性修复。
- 重新分析或添加可重复的测量,以确认性能有所改善。
性能分析基本原则
- 尽可能在设备上分析;Simulator 使用的是宿主机的 CPU 和内存。
- 使用 Release 配置,因为优化可能会改变热点路径。
- 使用有代表性的数据复现问题,不要使用空数据库或测试素材。
- 关闭无关应用,减少分析过程中的干扰。
- 保留修复前后的测量结果,明确呈现效果。
- 如果工作流需要持续观察耗时,可添加
os_signpost标记。
Xcode 诊断
如果 Scheme > Run > Diagnostics 中的设置与疑似问题相符,请建议启用相关设置:
| 设置 | 用途 |
|---|---|
| Main Thread Checker | 检查主线程以外的 UI 操作 |
| Thread Sanitizer | 检查数据竞争和不安全的共享状态 |
| Address Sanitizer | 检查缓冲区溢出和释放后使用问题 |
| Malloc Stack Logging | 查看分配调用堆栈 |
| Zombie Objects | 检查向已释放对象发送的消息 |
MetricKit 接入
建议使用 MetricKit 监控生产环境中的启动、响应能力、内存和诊断信息:
import MetricKit
final class PerformanceReporter: NSObject, MXMetricManagerSubscriber {
func startCollecting() {
MXMetricManager.shared.add(self)
}
func didReceive(_ payloads: [MXMetricPayload]) {
for payload in payloads {
if let launch = payload.applicationLaunchMetrics {
log("Resume time: \(launch.histogrammedResumeTime)")
}
if let responsiveness = payload.applicationResponsivenessMetrics {
log("Hang time: \(responsiveness.histogrammedApplicationHangTime)")
}
if let memory = payload.memoryMetrics {
log("Peak memory: \(memory.peakMemoryUsage)")
}
}
}
func didReceive(_ payloads: [MXDiagnosticPayload]) {
for payload in payloads {
if let hangs = payload.hangDiagnostics {
for hang in hangs {
log("Hang: \(hang.callStackTree)")
}
}
}
}
}
检查清单
响应能力:
- 主线程上没有耗时超过 100 ms 的同步操作。
- 主线程上没有文件 I/O 或网络调用。
- 大型 Core Data 或 SwiftData 查询使用后台上下文。
- 在主线程以外解码图像。
@MainActor仅用于确实需要访问 UI 的代码。
内存:
- 委托、闭包、观察者或异步任务中没有保留环。
- 不再可见时释放大型资源。
- 集合和缓存的大小受到限制。
- 在会创建 Objective-C 对象的紧密循环中使用
autoreleasepool。
启动:
- 不在
@main App结构体的init()中执行繁重操作。 - 延后非必要的初始化。
- 在可行的情况下尽量减少动态框架。
- 启动期间不执行同步网络调用。
能耗:
- 后台任务使用适当类型的
BGTaskScheduler请求。 - 定位精度符合产品需求。
- 计时器设置容差,以便系统合并唤醒操作。
- 尽可能批量处理并缓存网络请求。
参考资料
references/time-profiler.md:CPU 性能分析、卡顿检测、signpost API。references/memory-profiling.md:内存分配、泄漏、Memory Graph 调试器。references/launch-optimization.md:启动阶段和冷启动/热启动优化。references/energy-diagnostics.md:电池、热状态和网络效率。
评论
支持 Markdown