iOS 性能工具

iOS 性能工具

目录


概览

iOS 平台提供了丰富的性能分析工具,覆盖开发调试、生产监控、GPU 分析等多个场景。本文档系统性地介绍了各类性能工具的使用方法和最佳实践。

工具分类

官方工具

  • Xcode Instruments:苹果官方提供的性能分析工具集,包含 Time Profiler(CPU)、Allocations/Leaks(内存)、Energy Log(能耗)、Core Animation、Network、File I/O 等,功能全面且深入,适合本地开发和调试阶段。
  • XCTest + XCTMetric:苹果官方测试框架,支持性能测试指标(执行时间、内存、CPU),可集成 CI/CD,适合自动化性能回归检测。
  • Metal Performance HUD:苹果官方图形性能调试工具,实时显示渲染帧率、GPU 开销等图形相关指标,适合游戏和图形密集型应用。

第三方工具

  • 设备管理工具:tidevice、Facebook idb、libimobiledevice、ifuse 等,用于设备连接和数据采集
  • 线上监控工具(APM):Firebase Performance、Sentry、New Relic 等,用于生产环境性能监控
  • 网络调试工具:Charles Proxy、Proxyman 等,用于网络问题诊断
  • 静态扫描工具:oclint、infer、clang-tidy 等,用于代码质量检测
  • 开源/自研工具:PerformanceSuite、Swift-Metrics、FBRetainCycleDetector 等,用于自定义监控方案

快速索引

按使用阶段选择

  • 开发阶段:Xcode Instruments + Metal Performance HUD(图形应用)+ Charles/Proxyman(网络调试)
  • 测试阶段:XCTest + XCTMetric + Firebase Performance(预发布监控)+ 网络调试工具
  • 生产环境:Firebase Performance / Sentry / New Relic(APM)+ PerformanceSuite(自研监控)+ Crashlytics(崩溃监控)

按问题类型选择

  • CPU 热点分析:Time Profiler、System Trace
  • 内存泄漏:Leaks、Allocations、FBRetainCycleDetector
  • UI 卡顿:Core Animation FPS、Hitches、Runloops
  • 启动时间:Time Profiler、自定义 trace
  • 网络性能:Charles/Proxyman、Network Link Conditioner
  • GPU 性能:Metal Performance HUD、Core Animation Commits
  • 能耗分析:Energy Log

按性能开销选择

  • 低开销:Firebase Performance(采样)、XCTest、静态扫描工具
  • 中等开销:Sentry(采样 profiling)、New Relic(采样)
  • 高开销:Instruments(完整配置)、AddressSanitizer

工具选择建议

以上快速索引提供了不同场景下的工具选择建议。具体工具的使用方法和详细说明请参考后续章节。

业界成熟工具对比

工具名称 类型 主要功能 适用场景 优势 局限
Xcode Instruments 官方 Profiling CPU、内存、GPU、能耗、网络、I/O 分析 本地开发调试 功能全面、深入底层、免费 学习曲线陡、无法线上监控
Firebase Performance 线上 APM 启动时间、网络延迟、屏幕渲染监控 生产环境监控 集成简单、成本低、Google 生态 深度诊断能力有限
Sentry 错误+性能监控 崩溃、慢事务、卡顿、代码级 profiling 生产环境监控 错误和性能统一、profiling 能力强 采样率需控制、SDK 大小需考虑
New Relic Mobile 企业级 APM 崩溃、网络跟踪、性能趋势、分布式 tracing 大型应用监控 功能全面、多维度分析 成本高、集成复杂
Dynatrace 企业级 APM AI 驱动问题检测、全栈监控 跨平台企业应用 智能分析、自动化告警 成本高、配置复杂
Charles/Proxyman 网络调试 HTTP/HTTPS 抓包、网络性能分析 网络问题诊断 直观、实时抓包 仅覆盖网络层
PerformanceSuite 开源监控 TTI、冻结时间、启动时间、UI 渲染 自研监控体系 高度自定义、轻量 需自建后端和 Dashboard

一、官方工具

1.1 Xcode Instruments

Xcode Instruments 是苹果官方提供的性能分析工具集,功能全面且深入,是 iOS 性能分析的首选工具。它提供了 CPU、内存、I/O、卡顿、能耗等多个维度的分析能力。

1.1.1 基本使用

命令行使用
# 开始采集
xcrun xctrace record --template 'Time Profiler' --attach pid --output 34.trace --device uuid --time-limit 1000ms

# 导出 XML
xcrun xctrace export --input 34.trace --xpath '/trace-toc/run[@number="1"]/data/table[@schema="time-profile"]' --output 34.xml
GUI 使用
  1. 在 Xcode 中选择 Product > Profile(或按 Cmd+I
  2. 选择相应的 Instrument 模板
  3. 点击录制按钮开始采集
  4. 操作应用,观察性能数据
  5. 停止录制,分析结果

1.1.2 CPU 分析

System Trace

功能:记录 App 运行过程中线程和内存详细调度信息

特点
– 一般只能记录 10S 的数据(数据量大)
– 可以查看线程调度、系统调用、内存分配等详细信息
– 适合分析系统级性能问题

使用场景
– 分析线程调度问题
– 查看系统调用频率
– 诊断多线程竞争问题

Time Profiler

功能:记录应用和线程的 CPU 使用率和线程对应的调用堆栈

原理
– 默认 1ms 采样一次,只采集在运行线程的调用栈
– 以统计学的方式汇总数据
– 适合粗粒度的分析

优化建议:如果统计出来的时间和实际的时间相差比较多,可以尝试开启:
High Frequency:降低采样的时间间隔,提高精度
Record Kernel Callstacks:记录内核的调用栈,可以看到系统调用
Record Waiting Thread:记录被 block 的线程,可以看到等待时间

使用场景
– CPU 热点分析
– 函数调用时间统计
– 性能瓶颈定位

System Load

功能:监控系统负载和线程优先级

关键点:线程有优先级,高优先级的线程不应该超过系统核心数量

使用场景
– 分析线程优先级问题
– 查看系统负载情况

System Call Tree

功能:显示系统调用树,可以看到应用调用了哪些系统 API

使用场景
– 分析系统调用频率
– 定位系统调用相关的性能问题

Thread State Trace

功能:追踪线程状态变化

关键状态
Running:正在运行
Waiting:等待中
Suspended:挂起
Preempted:被抢占

关键点:主要关注挂起和抢占两个状态,记住主线程不是一直在运行的

使用场景
– 分析线程调度问题
– 查看线程等待时间
– 诊断线程阻塞问题

CPU Counter

功能:监控 CPU 硬件计数器,如指令数、缓存命中率等

使用场景
– 深入分析 CPU 性能
– 硬件级性能优化

CPU Profiler

功能:CPU 性能分析器,提供更详细的 CPU 使用情况

使用场景
– 详细的 CPU 性能分析
– 函数级性能优化

Activity Monitor(活动监视器)

功能:记录系统所有进程的活动,可以理解为任务管理器

使用场景
– 查看系统整体资源使用情况
– 对比不同应用的资源消耗

GCD Performance

功能:分析 Grand Central Dispatch(GCD)的性能

使用场景
– 分析 GCD 队列使用情况
– 优化并发性能

1.1.3 内存分析

Leaks

功能:检测内存泄漏

内存分类

  • Leaked memory:Memory unreferenced by your application that cannot be used again or freed (also detectable by using the Leaks instrument).
  • Abandoned memory:Memory still referenced by your application that has no useful purpose.

重要说明:Instruments 只能检测 Leaked memory,也就是说循环引用的内存无法用 Leaks 检测

descript

使用场景
– 检测未释放的内存
– 发现内存泄漏问题

局限性
– 无法检测循环引用导致的内存泄漏
– 需要使用 Allocations 配合检测 Abandoned memory

Allocations

功能:跟踪内存分配情况,可以用于检测 Abandoned memory

检测方法:查看 #persistent 个数是否一直在增长

Mark Generation 功能
– 通过 mark generation 截取内存快照
– 通过快照对比可以快速的发现内存泄漏
– 对比两个快照之间的内存增长

使用场景
– 检测内存增长趋势
– 发现内存泄漏(包括循环引用)
– 分析内存分配模式

Virtual Memory Trace

功能:跟踪每个活跃线程的虚拟内存使用情况

关键事件:主要关注 Page In 这个事件,因为启动路径上有很多次 Page In,且相对耗时

使用场景
– 分析启动性能
– 查看内存分页情况
– 优化内存访问模式

VM Tracker

功能:按标签区域统计进程的虚拟内存使用情况

使用场景
– 查看内存分布情况
– 分析内存占用结构
– 优化内存使用

1.1.4 IO 分析

Disk I/O Latency

功能:查看每个 I/O 操作的完成时间

使用场景
– 分析磁盘 I/O 性能
– 定位慢 I/O 操作
– 优化文件读写性能

Disk Usage

功能:记录磁盘 I/O 操作

descript

使用场景
– 查看磁盘 I/O 频率
– 分析 I/O 模式
– 优化文件操作

Filesystem Suggestions

功能:查看失败的文件操作

使用场景
– 发现文件操作错误
– 诊断文件系统问题

Filesystem Activity

功能:查看文件的活动操作

使用场景
– 监控文件访问情况
– 分析文件操作性能

Core Data 相关工具

Core Data Faults:监控 Core Data 的 Fault 操作,用于分析 Core Data 性能和优化数据访问模式。

Core Data Fetches:监控 Core Data 的 Fetch 操作,用于分析 Core Data 查询性能和优化数据查询。

Core Data Saves:监控 Core Data 的 Save 操作,用于分析 Core Data 保存性能和优化数据持久化。

1.1.5 卡顿分析

Hangs

功能:检测应用挂起(Hang)事件

使用场景
– 发现应用无响应问题
– 分析主线程阻塞

Hitches

功能:检测帧率下降(Hitch)事件

使用场景
– 分析 UI 卡顿问题
– 优化渲染性能

Core Animation Commits(核心动画提交)

功能:查看动画提交间隔

使用场景
– 分析动画性能
– 优化动画流畅度

Core Animation FPS(核心动画帧率)

功能:查看视频帧的渲染帧率

使用场景
– 监控帧率稳定性
– 分析渲染性能

Advanced Graphics Statistics(高级图形统计)

功能:查看图形驱动相关的统计,属于低层次硬件相关的统计数据

使用场景
– 深入分析 GPU 性能
– 硬件级图形优化

Display(显示)

功能:监控显示相关的性能指标

使用场景
– 分析显示性能
– 优化渲染流程

Runloops

功能:分析 Runloop 的性能

使用场景
– 分析主线程性能
– 优化事件处理

1.1.6 能耗分析

Energy Log

功能:监控应用的能耗情况

关键指标
– CPU 使用率
– 网络活动
– 定位服务使用
– 屏幕亮度
– GPU 使用

使用场景
– 优化电池续航
– 分析能耗热点
– 减少不必要的资源消耗

1.2 XCTest + XCTMetric

简介:苹果官方测试框架,支持性能测试指标

主要功能
– 执行时间测试
– 内存使用测试
– CPU 使用测试
– 可集成 CI/CD

优势
– 官方支持,稳定可靠
– 适合自动化性能回归检测
– 与 Xcode 集成良好

使用场景
– 自动化性能测试
– CI/CD 集成
– 性能回归检测

集成方式

func testPerformance() {
    measure {
        // 需要测试性能的代码
    }
}

func testMemoryUsage() {
    measure(metrics: [XCTMemoryMetric()]) {
        // 需要测试内存的代码
    }
}

1.3 Metal Performance HUD

简介:苹果官方图形性能调试工具

主要功能
– 实时显示渲染帧率
– GPU 开销监控
– 图形相关指标展示

优势
– 官方工具,稳定可靠
– 实时监控,无需额外配置
– 适合图形密集型应用

使用场景
– 游戏性能调试
– 图形密集型应用优化
– GPU 性能分析

使用方法
1. 在 Xcode 中运行应用
2. 在设备上启用 Metal Performance HUD(设置 > 开发者 > Metal Performance HUD)
3. 实时查看 GPU 性能指标


二、第三方工具

2.1 设备管理工具

2.1.1 基本原理

数据采集方式

卡顿堆栈和线程快照采集

  1. 使用 ktrace 里面的 kdebug 采集卡顿数据
  2. 使用 ktrace 里面的 kperform 采集线程快照
数据访问方式

使用苹果提供的后门服务,端口号 62078

  • ktrace:内核追踪工具
  • dtrace:动态追踪工具

ktrace 数据获取工具

通过苹果的 62078 端口,可以使用以下工具:
libimobiledevice (mobiledevice)
Facebook idb
– 阿里 tidevice

2.1.2 工具介绍

阿里 tidevice

简介:阿里开源的工具,通过苹果 62078 端口访问设备

功能
– 支持 ktrace、dtrace 等数据采集
– 设备管理
– 性能数据采集

安装

pip install tidevice

使用示例

# 查看设备列表
tidevice list

# 启动应用
tidevice launch com.example.app

# 性能监控
tidevice perf
Facebook idb

简介:Facebook 开源的 iOS 设备管理工具

功能
– 设备管理
– 性能数据采集
– 应用调试

安装

brew tap facebook/fb
brew install idb-companion
pip install fb-idb

使用示例

# 查看设备
idb list-targets

# 启动应用
idb launch com.example.app
libimobiledevice

简介:跨平台 iOS 设备通信库

功能
– 设备管理
– 数据访问
– 文件传输

安装

brew install libimobiledevice

使用示例

# 查看设备
idevice_id -l

# 获取设备信息
ideviceinfo
ifuse

简介:iOS 挂载文件系统工具

安装步骤

  1. ifuse 是一个依赖 libimobiledevice 库的工具,所以必须首先安装 libimobiledevice
  2. 首先去 https://osxfuse.github.io/ 下载 fuse for macOS 的库
  3. 然后 GitHub 上 clone 下载 ifuse 最新源码到本地
./autogen.sh
./configure
make
make install

# 挂载会议文件系统
ifuse --container com.tencent.meeting.dev meeting_log

# 会议日志目录
/Users/zhengjunming/Documents/mj_git/meeting_log/Library/Application Support/com.tencent.meeting.dev/Global/Logs

Developer Disk Image 路径

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport

2.2 线上监控工具(APM)

2.2.1 Firebase Performance Monitoring

简介:Google 提供的生产环境性能监控 SDK

主要功能
– 自动采集启动时间
– 网络请求延迟监控
– 屏幕渲染性能监控
– 自定义 trace 和 metric

优势
– 集成简单,开箱即用
– 成本低(免费额度较高)
– Google 生态整合好
– 实时用户数据对比

局限性
– 深度诊断能力有限
– 采样频率需要额外配置
– 复杂问题定位不够精细

集成方式

// Podfile
pod 'Firebase/Performance'

// 使用
Performance.startTrace("custom_trace")
// ... 代码执行 ...
Performance.stopTrace("custom_trace")

2.2.2 Sentry Mobile

简介:错误跟踪和性能监控平台

主要功能
– 崩溃和异常捕获
– 慢事务监控
– 卡顿检测
– 代码级 profiling
– Session replay

优势
– 错误和性能统一监控
– Profiling 能力强
– Dashboard 可视化直观
– 支持按版本/设备/用户分组

局限性
– 采样率需控制(避免 overhead)
– SDK 大小需考虑
– 某些功能仍在 beta 阶段

集成方式

// Podfile
pod 'Sentry'

// 初始化
SentrySDK.start { options in
    options.dsn = "your-dsn"
    options.enableProfiling = true
}

2.2.3 New Relic Mobile

简介:企业级 APM 工具

主要功能
– 实时崩溃监控
– 网络调用跟踪
– 性能趋势分析
– 分布式 tracing
– 错误分组和 triage

优势
– 功能全面
– 多维度分析
– 适合大型应用
– 与后端 APM 整合

局限性
– 成本高
– 集成复杂
– SDK 大小和依赖需注意

适用场景
– 大型或中型企业应用
– 对性能和稳定性要求高
– 希望前后端统一监控

2.2.4 其他 APM 工具

Dynatrace

特点
– AI 驱动问题检测
– 全栈监控(移动端 + 后端)
– 自动化告警
– 适合跨平台企业应用

Datadog

特点
– 云监控平台
– 跨平台监控
– APM + 日志分析
– 适合云环境和混合环境

AppDynamics

特点
– 企业级 APM
– 端到端监控
– 用户体验、后端接口、崩溃、事务等多维度分析

2.3 网络调试工具

2.3.1 Charles Proxy

简介:HTTP/HTTPS 抓包工具

主要功能
– HTTP/HTTPS 请求抓包
– 请求响应时间分析
– Payload 大小分析
– 模拟网络延迟
– 模拟离线环境
– 请求重写和断点调试

优势
– 界面直观
– 实时抓包
– 功能强大
– 跨平台支持

使用场景
– 网络问题诊断
– API 接口调试
– 网络性能分析
– 接口 Mock

配置 HTTPS 解密
1. 安装 Charles 根证书
2. 在 iOS 设备上信任证书
3. 配置 SSL Proxying

2.3.2 Proxyman

简介:macOS 专用的网络调试工具

主要功能
– HTTP/HTTPS 抓包
– HTTPS 解密
– 网络性能分析
– 请求重写
– 脚本支持

优势
– 界面友好
– macOS 原生应用
– 性能优秀
– 功能全面

使用场景
– macOS 开发环境网络调试
– iOS 应用网络问题诊断
– API 接口测试

2.4 静态扫描工具

2.4.1 oclint

简介:静态代码分析工具

功能
– 代码质量检测
– 潜在问题发现
– 代码规范检查
– 性能问题检测

集成方式

# 安装
brew install oclint

# 使用
oclint-json-compilation-database -- -report-type html -o report.html

使用场景
– CI/CD 集成
– 代码质量检查
– 代码审查辅助

2.4.2 infer

简介:Facebook 开源的静态分析工具

功能
– 内存泄漏检测
– 空指针检测
– 资源泄漏检测
– 并发问题检测

集成方式

# 安装
brew install infer

# 使用
infer run -- xcodebuild -workspace App.xcworkspace -scheme App

使用场景
– 内存问题检测
– 并发问题发现
– 代码质量提升

2.4.3 clang-tidy

简介:LLVM 提供的静态分析工具

功能
– C/C++/Objective-C 代码检查
– 代码规范检查
– 性能问题检测
– 现代化代码建议

集成方式

# 使用
clang-tidy file.m -- -I/path/to/include

使用场景
– Objective-C/C++ 代码检查
– 代码现代化
– 性能优化建议

2.5 开源/自研工具

2.5.1 Booking.com PerformanceSuite

简介:开源性能监控库

主要功能
– TTI(Time-to-Interactive)监控
– 冻结时间检测
– 启动时间监控
– UI 渲染指标
– Watchdog 终止异常检测

优势
– 开源免费
– 高度自定义
– 轻量级
– 适合自研监控体系

局限性
– 需自建后端和 Dashboard
– 需要一定的开发成本

适用场景
– 需要自定义监控指标
– 希望控制数据采集和存储
– 预算有限的项目

2.5.2 Swift-Metrics

简介:Swift 指标 API

主要功能
– Counter、Gauge、Timer 等指标接口
– 便于集成 Prometheus、OpenTelemetry 等后端
– 标准化指标收集

优势
– 标准化 API
– 易于集成
– 支持多种后端

适用场景
– 需要标准化指标收集
– 集成 Prometheus/OpenTelemetry
– 微服务架构

2.5.3 DBDebugToolkit

简介:iOS 调试工具集

主要功能
– 运行时调试能力
– UI 调试工具
– 网络请求查看
– 数据库查看

优势
– 功能全面
– 易于集成
– 开发阶段实用

适用场景
– 开发阶段调试
– 快速问题定位

2.5.4 FBRetainCycleDetector

简介:Facebook 开源的循环引用检测工具

主要功能
– 检测循环引用
– 内存泄漏检测
– 运行时分析

优势
– 开源免费
– 检测准确
– 易于集成

适用场景
– 内存泄漏检测
– 循环引用排查

2.5.5 fishhook

简介:Facebook 开源的函数 hook 工具

主要功能
– 函数 hook
– 运行时拦截
– 性能监控基础工具

优势
– 开源免费
– 功能强大
– 适合高级用法

适用场景
– 自定义性能监控
– 函数调用拦截
– 高级调试需求


留下评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Index