一、Instruments 核心套件概览
| 工具 | 主要用途 | 应用场景 |
|---|---|---|
| Time Profiler | CPU 性能分析 | 查找性能瓶颈,优化耗时操作 |
| Allocations | 内存分配分析 | 内存泄漏,内存峰值,对象生命周期 |
| Leaks | 内存泄漏检测 | 自动检测循环引用,未释放内存 |
| Network | 网络请求分析 | 请求耗时,数据大小,连接复用 |
| Energy Log | 能耗分析 | 电池消耗优化 |
| Core Animation | 图形渲染分析 | UI 卡顿,离屏渲染,图层混合 |
| System Trace | 系统级分析 | 综合性能,线程状态,系统调用 |
二、Time Profiler - CPU 性能分析
1. 基础使用方法
启动方式: 1. Xcode → Product → Profile (⌘I) 2. 选择 Time Profiler 3. 点击录制按钮开始分析
2. 关键配置选项
- 采样间隔设置 (推荐): 1ms (1000Hz) 用于精细分析
- 记录选项: Separate by Thread (按线程分离) / Invert Call Tree (反转调用树) / Hide System Libraries (隐藏系统库) / Show Obj-C Only (仅显示Obj-C)
- 符号化(Symbolication):确保 Build Settings → Debug Information Format = DWARF with dSYM
3. 用途说明:用于分析应用 CPU 负载,查找性能瓶颈。
- 时间线窗口:展示 CPU 使用率的变化。
- 调用树(Call Tree):展示函数调用栈,帮助识别占用 CPU 资源的代码段。
- 样本窗格(Sample Pane):详细展示每个采样周期内的调用信息。
三、Allocations - 内存分配分析
Swift
// 问题代码:内存持续增长
class MemoryLeakDemo {
var dataCache: [String: Data] = [:]
func loadData(for key: String) {
// 模拟加载数据,但从不清理
let data = loadFromNetwork(key)
dataCache[key] = data
// 更好的做法:使用 NSCache 或设置大小限制
// 或定期清理旧数据
}
}
// 使用 Allocations 检测:
// 1. 标记 Generation 1
// 2. 执行操作
// 3. 标记 Generation 2
// 4. 对比两个 Generation 的 "Persistent Bytes"
四、Leaks - 内存泄漏检测
Swift
// 1. 闭包循环引用
class LeakyViewController: UIViewController {
var dataHandler: (() -> Void)?
override func viewDidLoad() {
super.viewDidLoad()
// ❌ 泄漏:闭包强引用 self
dataHandler = {
self.updateUI() // 隐式强引用 self
}
}
// ✅ 解决方案:weak 或 unowned
func safeClosure() {
dataHandler = { [weak self] in
self?.updateUI()
}
}
}
// 2. 委托循环引用
class DelegateLeak {
var delegate: SomeDelegate?
init() {
let controller = ViewController()
controller.delegate = self // 双向强引用
self.delegate = controller
}
}
// 3. 定时器泄漏
class TimerLeak {
var timer: Timer?
func startTimer() {
// ❌ 泄漏:timer 强引用 self
timer = Timer.scheduledTimer(timeInterval: 1,
target: self,
selector: #selector(tick),
userInfo: nil,
repeats: true)
}
// ✅ 解决方案:使用 weak 代理或 block-based timer
func safeTimer() {
timer = Timer.scheduledTimer(withTimeInterval: 1,
repeats: true) { [weak self] _ in
self?.tick()
}
}
}
五、Network - 网络分析
Swift
// Network 仪器显示的关键数据:
struct NetworkMetrics {
let requestCount: Int // 请求总数
let totalDataTransferred: Int // 总传输数据
let averageResponseTime: TimeInterval // 平均响应时间
let connections: Int // 并发连接数
}
// 1. 减少请求数量
class NetworkOptimization {
// ❌ 多个小请求
func loadUserDataBad() {
fetchProfile()
fetchSettings()
fetchMessages()
fetchNotifications()
}
// ✅ 合并请求
func loadUserDataGood() {
fetchCombinedData() // 一个请求获取所有数据
}
}
// 2. 优化数据传输
class DataOptimization {
// 使用压缩
func configureSession() -> URLSession {
let config = URLSessionConfiguration.default
config.httpAdditionalHeaders = [
"Accept-Encoding": "gzip, deflate"
]
return URLSession(configuration: config)
}
// 使用缓存
func setupCache() {
let cache = URLCache(
memoryCapacity: 50 * 1024 * 1024, // 50MB
diskCapacity: 200 * 1024 * 1024, // 200MB
diskPath: "networkCache"
)
URLCache.shared = cache
}
}
六、Core Animation - UI 性能分析
Color Blended Layers (图层混合)
Color Hits Green and Misses Red (光栅化缓存)
Color Copied Images (颜色格式转换)
Color Non-Standard Surface Formats (非标准表面格式)
Flash Updated Regions (重绘区域)
Swift
// 1. 离屏渲染问题
class OffscreenRendering {
// ❌ 造成离屏渲染
func setupProblematicView() {
let view = UIView()
view.layer.cornerRadius = 10
view.layer.shadowOpacity = 0.5
view.layer.shadowRadius = 5
// Core Animation 会显示黄色警告
}
// ✅ 优化方案
func setupOptimizedView() {
let view = UIView()
view.layer.cornerRadius = 10
// 设置 shadowPath 避免离屏渲染
view.layer.shadowPath = UIBezierPath(roundedRect: view.bounds,
cornerRadius: 10).cgPath
view.layer.shadowOpacity = 0.5
view.layer.shadowRadius = 5
// 开启光栅化
view.layer.shouldRasterize = true
view.layer.rasterizationScale = UIScreen.main.scale
}
}
// 2. 图层混合问题
class BlendedLayers {
// ❌ 透明背景导致混合
func createTransparentView() {
let label = UILabel()
label.backgroundColor = .clear // 会导致混合
label.textColor = .black
// Core Animation 会显示红色警告
}
// ✅ 使用不透明背景
func createOpaqueView() {
let label = UILabel()
label.backgroundColor = .white // 不透明
label.isOpaque = true
label.textColor = .black
}
}
帧率优化
Swift
// 使用 CADisplayLink 监控帧率
class FPSMonitor {
private var displayLink: CADisplayLink?
private var lastTimestamp: CFTimeInterval = 0
private var frameCount: Int = 0
func startMonitoring() {
displayLink = CADisplayLink(target: self, selector: #selector(tick))
displayLink?.add(to: .main, forMode: .common)
}
@objc private func tick(_ link: CADisplayLink) {
if lastTimestamp == 0 {
lastTimestamp = link.timestamp
return
}
frameCount += 1
let delta = link.timestamp - lastTimestamp
if delta >= 1.0 {
let fps = Double(frameCount) / delta
print("当前帧率: \(fps)")
frameCount = 0
lastTimestamp = link.timestamp
// 帧率低于 55 时警告
if fps < 55 {
print("⚠️ 帧率过低: \(fps)")
}
}
}
}
七、Energy Log - 能耗分析
Swift
// 主要能耗来源:
class EnergyConsumption {
// 1. CPU 使用率
func highCPUUsage() {
// 死循环或密集计算
while true {
performHeavyCalculation()
}
}
// 2. 网络活动
func frequentNetworkRequests() {
// 频繁的短连接
Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { _ in
fetchData()
}
}
// 3. 定位服务
func continuousLocationUpdates() {
locationManager.startUpdatingLocation() // 持续更新
// 应使用 significantLocationChanges 或 regionMonitoring
}
// 4. 屏幕亮度
func maxBrightness() {
UIScreen.main.brightness = 1.0 // 最高亮度
}
}
八、System Trace - 系统级分析
System Trace 显示:所有线程的状态和调用栈 / 系统调用和内核事件 / 锁竞争和等待时间 / 文件 I/O 操作