关于 axiom-ios-performance
面向 iOS 开发者的性能问题路由技能,根据内存、卡顿、能耗、计时器等症状,将排查工作引导至对应技能或 Agent。
主要功能
- 01按性能症状路由到专门技能
- 02区分内存、卡顿与能耗问题
- 03提供 GUI 和命令行分析路径
- 04支持自动化审计与性能分析路由
适用场景
- 01确定应用变慢时的分析起点
- 02排查内存增长或泄漏
- 03诊断应用冻结与电池消耗
- 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
- 完整的命令语法
- 断点配置示例
- 表达式求值模式
决策树
- 内存持续增长,同时 UI 卡顿或掉帧?→ 优先使用 memory-debugging(内存压力会导致 GC 暂停并造成掉帧),如果修复内存问题后仍然卡顿,再使用 performance-profiling
- 内存泄漏(Swift)?→ memory-debugging
- 内存泄漏(Objective-C 闭包)?→ objc-block-retain-cycles
- 应用卡住或冻结——UI 是否完全无响应(无法点击,也没有反馈)?
- 是 → hang-diagnostics(诊断繁忙还是阻塞)
- 否,只是缓慢 → performance-profiling(Time Profiler)
- 仅首次启动时出现?→ 还要在 hang-diagnostics 中检查同步 I/O 或延迟初始化
- 多个异步操作同时完成时出现变慢?→ 转到
axiom-ios-concurrency(回调争用问题,而非性能分析) - 电池耗电(已知具体症状)?→ energy-diag
- 电池耗电(需要 API 参考)?→ energy-ref
- 电池耗电(一般情况)?→ energy
- MetricKit 设置或解析?→ metrickit-ref
- 使用 GUI(Instruments)进行性能分析?→ performance-profiling
- 使用 CLI(xctrace)进行性能分析?→ xctrace-ref
- 立即运行自动化性能分析?→ performance-profiler Agent
- 一般性卡顿或延迟?→ performance-profiling
- 想主动扫描内存泄漏?→ memory-auditor(Agent)
- 想扫描能耗反模式?→ energy-auditor(Agent)
- 需要 Swift 性能审计(ARC、泛型、集合)?→ swift-performance-analyzer(Agent)
- 需要在运行时检查变量或线程状态?→ axiom-lldb
- 需要确切的 LLDB 命令语法?→ axiom-lldb-ref
- 滚动时计时器停止?→ timer-patterns(RunLoop 模式)
- 使用 DispatchSourceTimer 时出现 EXC_BAD_INSTRUCTION 崩溃?→ timer-patterns(4 种崩溃模式)
- 选择 Timer、DispatchSourceTimer、Combine timer 还是 async timer?→ timer-patterns
- 需要计时器 API 语法或生命周期信息?→ timer-patterns-ref
- 审查过时 Swift 模式的代码?→ swift-modern
- Claude 生成了旧式 API(DateFormatter、CGFloat、DispatchQueue)?→ swift-modern
- 需要在性能分析前查看运行时控制台输出?→ 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