mcpField
P
performance-profiling

performance-profiling

github.com/mengto开发7.1k1.4k 次安装3 天前更新
代码仓库

关于 performance-profiling

用于通过针对性分析和测量诊断、改善 Apple 应用性能的技能。它帮助开发者为卡顿、内存增长、启动延迟、能耗及网络浪费等问题选择分析流程。

主要功能

  1. 01按问题选择分析工具的指南
  2. 02CPU、内存、启动与能耗参考
  3. 03设备及 Release 构建分析建议
  4. 04修复前后测量流程
  5. 05Xcode 诊断与 MetricKit 指引

适用场景

  1. 01追踪界面卡顿或 CPU 占用过高
  2. 02调查内存泄漏与持续增长
  3. 03测量应用启动缓慢
  4. 04评估电池、热状态或网络开销

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/mengto/skills --skill performance-profiling

安装后在 Claude Code 中输入/performance-profiling确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

agents/
openai.yaml
demo/
expected-output.md
index.html
input.md
PROMPT.md
references/
energy-diagnostics.md
launch-optimization.md
memory-profiling.md
time-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 msTime 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

工作流

  1. 根据用户报告、跟踪记录、日志或代码路径确定性能问题类别。
  2. 除非问题范围较广或不明确,否则只阅读匹配的参考文件。
  3. 尽量使用 Release 构建在真实设备上进行分析,并采用有代表性的数据。
  4. 提出修复方案前,检查分析结果指出的代码路径。
  5. 采取能解决已测量瓶颈的最小针对性修复。
  6. 重新分析或添加可重复的测量,以确认性能有所改善。

性能分析基本原则

  • 尽可能在设备上分析;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