mcpField
A
axiom-ios-performance

axiom-ios-performance

github.com/charleswiltgen开发1.2k214 次安装今天更新
代码仓库

关于 axiom-ios-performance

面向 iOS 开发者的性能问题路由技能,根据内存、卡顿、能耗、计时器等症状,将排查工作引导至对应技能或 Agent。

主要功能

  1. 01按性能症状路由到专门技能
  2. 02区分内存、卡顿与能耗问题
  3. 03提供 GUI 和命令行分析路径
  4. 04支持自动化审计与性能分析路由

适用场景

  1. 01确定应用变慢时的分析起点
  2. 02排查内存增长或泄漏
  3. 03诊断应用冻结与电池消耗
  4. 04选择 Instruments 或 xctrace 分析方式

安装

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

$npx skills add https://github.com/charleswiltgen/axiom --skill axiom-ios-performance

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

详细介绍

iOS 性能路由器

遇到任何性能问题时都必须使用此技能,包括内存泄漏、执行缓慢、电池耗电或性能分析。

适用场景

以下情况请使用此路由器:

  • 应用运行缓慢或卡顿
  • 内存占用随时间不断增长
  • 电池电量消耗过快
  • 使用期间设备发热
  • “电池”设置中显示能耗较高
  • 使用 Instruments 诊断性能问题
  • 内存泄漏或强引用循环
  • 应用因内存警告而崩溃

路由逻辑

内存问题

内存泄漏(Swift) → /skill axiom-memory-debugging

  • 系统化诊断泄漏
  • 5 种常见泄漏模式
  • Instruments 工作流
  • 未调用 deinit

内存泄漏扫描 → 启动 memory-auditor Agent 或使用 /axiom:audit memory(5 阶段语义审计:梳理资源所有权、检测 6 种泄漏模式、分析缺失的清理操作、关联复合风险、评估生命周期健康状况)

内存泄漏(Objective-C 块) → /skill axiom-objc-block-retain-cycles

  • 块强引用循环
  • 弱引用-强引用模式
  • 网络回调泄漏
性能分析

性能分析(GUI) → /skill axiom-performance-profiling

  • Time Profiler(CPU)
  • Allocations(内存增长)
  • Core Data 性能分析(N+1 查询)
  • 工具选择决策树

自动化性能分析(CLI) → /skill axiom-xctrace-ref

  • 无头 xctrace 性能分析
  • CI/CD 集成模式
  • 命令行跟踪记录
  • 以编程方式分析跟踪数据

运行自动化性能分析 → 使用 performance-profiler Agent 或 /axiom:profile

  • 通过 xctrace 记录跟踪数据
  • 导出并分析数据
  • 按严重程度报告发现
卡顿/冻结问题

应用卡顿或冻结 → /skill axiom-hang-diagnostics

  • UI 无响应超过 1 秒
  • 主线程被阻塞(忙碌或等待)
  • 决策树:诊断忙碌与阻塞
  • 选择 Time Profiler 或 System Trace
  • 8 种常见卡顿模式及修复方法
  • 被看门狗终止
能耗问题

电池耗电、能耗较高 → /skill axiom-energy

  • Power Profiler 工作流
  • 子系统诊断(CPU/GPU/网络/位置/显示屏)
  • 反模式修复
  • 后台执行优化

基于症状进行诊断 → /skill axiom-energy-diag

  • “应用在‘电池’设置中排名靠前”
  • “设备发热”
  • “后台耗电”
  • 各诊断路径的时间成本分析

附带代码的 API 参考 → /skill axiom-energy-ref

  • 完整的 WWDC 代码示例
  • 定时器、网络、位置效率
  • BGContinuedProcessingTask(iOS 26)
  • MetricKit 设置

能耗扫描 → 启动 energy-auditor Agent 或使用 /axiom:audit energy(8 种反模式:滥用定时器、轮询、持续定位、动画泄漏、误用后台模式、网络效率低下、GPU 浪费、磁盘 I/O)

定时器安全

定时器崩溃模式(DispatchSourceTimer) → /skill axiom-timer-patterns

  • 4 种会导致 EXC_BAD_INSTRUCTION 的崩溃场景
  • RunLoop 模式陷阱(滚动时 Timer 会停止)
  • SafeDispatchTimer 包装器
  • Timer 与 DispatchSourceTimer 的选择

定时器 API 参考 → /skill axiom-timer-patterns-ref

  • Timer、DispatchSourceTimer、Combine、AsyncTimerSequence API
  • 生命周期示意图
  • 平台可用性
Swift 性能

Swift 性能优化 → /skill axiom-swift-performance

  • 值类型与引用类型、写时复制
  • ARC 开销、泛型特化
  • 集合性能

Swift 性能扫描 → 启动 swift-performance-analyzer Agent 或使用 /axiom:audit swift-performance(不必要的复制、ARC 开销、未特化的泛型、集合效率低下、Actor 隔离开销、内存布局)

现代 Swift 习惯用法 → /skill axiom-swift-modern

  • 过时的 API 模式(Date()、CGFloat、DateFormatter)
  • Foundation 现代化(URL.documentsDirectory、FormatStyle)
  • Claude 特定的幻觉纠正
MetricKit 集成

MetricKit API 参考 → /skill axiom-metrickit-ref

  • MXMetricPayload 解析
  • MXDiagnosticPayload(崩溃、卡顿)
  • Field 性能数据采集
  • 与崩溃报告集成
运行时控制台捕获

捕获模拟器控制台输出 → /skill axiom-xclog-ref 或 /axiom:console

  • 捕获模拟器中 print()、os_log()、Logger 的输出
  • 包含 level、subsystem、category 的结构化 JSON
  • 使用 --timeout 和 --max-lines 限定采集范围
  • 按 subsystem 或正则表达式筛选
运行时状态检查

LLDB 交互式调试 → /skill axiom-lldb

  • 设置断点,在运行时检查变量
  • 根据崩溃日志重现崩溃
  • 分析卡顿时的线程状态
  • 检查 Swift 值(po 与 v)

LLDB 命令参考 → /skill axiom-lldb-ref

  • 完整的命令语法
  • 断点配置示例
  • 表达式求值模式

决策树

  1. 内存持续增长,同时 UI 卡顿或掉帧?→ 优先使用 memory-debugging(内存压力会导致 GC 暂停并造成掉帧),如果修复内存问题后仍然卡顿,再使用 performance-profiling
  2. 内存泄漏(Swift)?→ memory-debugging
  3. 内存泄漏(Objective-C 闭包)?→ objc-block-retain-cycles
  4. 应用卡住或冻结——UI 是否完全无响应(无法点击,也没有反馈)?
    • 是 → hang-diagnostics(诊断繁忙还是阻塞)
    • 否,只是缓慢 → performance-profiling(Time Profiler)
    • 仅首次启动时出现?→ 还要在 hang-diagnostics 中检查同步 I/O 或延迟初始化
  5. 多个异步操作同时完成时出现变慢?→ 转到 axiom-ios-concurrency(回调争用问题,而非性能分析)
  6. 电池耗电(已知具体症状)?→ energy-diag
  7. 电池耗电(需要 API 参考)?→ energy-ref
  8. 电池耗电(一般情况)?→ energy
  9. MetricKit 设置或解析?→ metrickit-ref
  10. 使用 GUI(Instruments)进行性能分析?→ performance-profiling
  11. 使用 CLI(xctrace)进行性能分析?→ xctrace-ref
  12. 立即运行自动化性能分析?→ performance-profiler Agent
  13. 一般性卡顿或延迟?→ performance-profiling
  14. 想主动扫描内存泄漏?→ memory-auditor(Agent)
  15. 想扫描能耗反模式?→ energy-auditor(Agent)
  16. 需要 Swift 性能审计(ARC、泛型、集合)?→ swift-performance-analyzer(Agent)
  17. 需要在运行时检查变量或线程状态?→ axiom-lldb
  18. 需要确切的 LLDB 命令语法?→ axiom-lldb-ref
  19. 滚动时计时器停止?→ timer-patterns(RunLoop 模式)
  20. 使用 DispatchSourceTimer 时出现 EXC_BAD_INSTRUCTION 崩溃?→ timer-patterns(4 种崩溃模式)
  21. 选择 Timer、DispatchSourceTimer、Combine timer 还是 async timer?→ timer-patterns
  22. 需要计时器 API 语法或生命周期信息?→ timer-patterns-ref
  23. 审查过时 Swift 模式的代码?→ swift-modern
  24. Claude 生成了旧式 API(DateFormatter、CGFloat、DispatchQueue)?→ swift-modern
  25. 需要在性能分析前查看运行时控制台输出?→ xclog-ref 或 /axiom:console

反合理化

想法实际情况
“我知道这是内存泄漏,让我找找看”内存泄漏有 6 种模式。memory-debugging 能在 15 分钟内诊断出正确类型,而不是花 2 小时。
“我直接运行 Time Profiler 就行”选错 Instruments 模板会浪费时间。performance-profiling 会先选择正确的工具。
“耗电问题大概出在网络层”能耗问题涉及 8 个子系统。energy 技能能诊断出真正原因。
“应用感觉很慢,我之后再优化”性能问题会不断累积。现在进行性能分析,之后能成倍节省时间。
“只是 UI 卡住了,大概是 API 调用太慢”卡顿可能由忙碌或阻塞导致。hang-diagnostics 为这两种情况提供了决策树。
“内存一直增长,而且滚动也卡顿——这是两个独立的 bug”内存压力会导致 GC 暂停,造成丢帧。先修复泄漏,再重新检查滚动性能。
“只有首次启动时会卡住,肯定是在加载什么东西”首次启动卡顿有 3 种模式:同步 I/O、延迟初始化、主线程竞争。hang-diagnostics 能诊断具体是哪一种。
“网络请求完成时 UI 就会卡住——那肯定是速度慢”多个回调同时完成 = 主线程竞争 = 并发问题。请转到 ios-concurrency。
“我直接加几条 print 语句来调试就行”每轮 print 调试都要花 3-5 分钟(构建 + 运行 + 复现)。LLDB 断点只需 30 秒。axiom-lldb 提供了相关命令。
“我看不到应用记录的日志”xclog 会从模拟器捕获 print() + os_log,并输出结构化 JSON。使用 /axiom:console 或 /skill axiom-xclog-ref。
“我直接用 Timer.scheduledTimer 就行,更简单”滚动时 Timer 会停止(.default 模式),而且会保留其目标对象(造成泄漏)。timer-patterns 提供了决策树。
“DispatchSourceTimer 崩溃只是偶发的,先发布吧”DispatchSourceTimer 有 4 种崩溃模式,而且都可确定性复现。timer-patterns 能诊断具体是哪一种。
“Claude 已经了解现代 Swift”Claude 默认采用 Swift 5.5 之前的模式(Date()、CGFloat、filter().count)。swift-modern 提供了修正表。

关键模式

内存调试(memory-debugging):

  • 6 种泄漏模式:定时器、观察者、闭包、代理、视图回调、PhotoKit
  • Instruments 工作流
  • 区分泄漏与缓存

性能分析(performance-profiling):

  • 使用 Time Profiler 查找 CPU 瓶颈
  • 使用 Allocations 查找内存增长
  • 使用 Core Data SQL 日志排查 N+1 查询
  • Self Time 与 Total Time

能耗优化(energy):

  • 使用 Power Profiler 诊断子系统
  • 8 种反模式:定时器、轮询、定位、动画、后台、网络、GPU、磁盘
  • 按子系统划分的审查清单
  • 用于抵御截止期限压力的压力场景

示例调用

用户:“我的应用内存占用一直在增长” → 调用:/skill axiom-memory-debugging

用户:“我遇到了内存泄漏,但没有调用 deinit” → 调用:/skill axiom-memory-debugging

用户:“我的应用感觉很慢,该从哪里着手?” → 调用:/skill axiom-performance-profiling

用户:“我的 Objective-C block 回调存在泄漏” → 调用:/skill axiom-objc-block-retain-cycles

用户:“我的应用耗电很快” → 调用:/skill axiom-energy

用户:“用户说使用我的应用时设备会发烫” → 调用:/skill axiom-energy-diag

用户:“高效实现位置跟踪的最佳方式是什么?” → 调用:/skill axiom-energy-ref

用户:“分析我的应用的 CPU 使用情况” → 使用:performance-profiler Agent(或 /axiom:profile)

用户:“如何从命令行运行 xctrace?” → 调用:/skill axiom-xctrace-ref

用户:“我需要为 CI/CD 进行无头分析” → 调用:/skill axiom-xctrace-ref

用户:“我的应用有时会卡住” → 调用:/skill axiom-hang-diagnostics

用户:“UI 冻结并且无响应” → 调用:/skill axiom-hang-diagnostics

用户:“主线程被阻塞了,该如何诊断?” → 调用:/skill axiom-hang-diagnostics

用户:“如何设置 MetricKit?” → 调用:/skill axiom-metrickit-ref

用户:“如何解析 MXMetricPayload?” → 调用:/skill axiom-metrickit-ref

用户:“扫描我的代码,查找内存泄漏” → 调用:memory-auditor Agent

用户:“检查我的应用是否存在耗电问题” → 调用:energy-auditor Agent

用户:“审查我的 Swift 代码,查找性能反模式” → 调用:swift-performance-analyzer Agent

用户:“如何在调试器中检查这个变量?” → 调用:/skill axiom-lldb

用户:“LLDB 中设置条件断点的命令是什么?” → 调用:/skill axiom-lldb-ref

用户:“我需要在调试器中重现这个崩溃” → 调用:/skill axiom-lldb

用户:“我的列表滚动很慢,而且内存一直在增长” → 先调用:/skill axiom-memory-debugging;如果仍然卡顿,再调用 /skill axiom-performance-profiling

用户:“应用首次启动时会冻结几秒钟,之后就正常了” → 调用:/skill axiom-hang-diagnostics

用户:“多个 API 调用同时返回时,UI 会卡住” → 跨路由:/skill axiom-ios-concurrency(回调争用)

用户:“用户滚动时,我的计时器会停止” → 调用:/skill axiom-timer-patterns

用户:“我的计时器代码出现 EXC_BAD_INSTRUCTION 崩溃” → 调用:/skill axiom-timer-patterns

用户:“我应该使用 Timer 还是 DispatchSourceTimer?” → 调用:/skill axiom-timer-patterns

用户:“如何创建 AsyncTimerSequence?” → 调用:/skill axiom-timer-patterns-ref

用户:“检查我的 Swift 代码,看看是否有过时的模式” → 调用:/skill axiom-swift-modern

用户:“有没有更现代的实现方式?” → 调用:/skill axiom-swift-modern

用户:“应用记录了什么日志?我需要查看控制台输出” → 调用:/skill axiom-xclog-ref 或 /axiom:console

用户:“在我重现这个 bug 时,捕获模拟器日志” → 调用:/skill axiom-xclog-ref 或 /axiom:console

评论

支持 Markdown