Loading...
Loading...
Compare original and translation side by side
os_signpostos_signpostWhat performance problem are you investigating?
│
├─ App hangs / stutters / dropped frames / slow UI
│ └─ Read time-profiler.md
│
├─ High memory / leaks / OOM crashes / growing footprint
│ └─ Read memory-profiling.md
│
├─ Slow app launch / time to first frame
│ └─ Read launch-optimization.md
│
├─ Battery drain / thermal throttling / background energy
│ └─ Read energy-diagnostics.md
│
├─ General "app feels slow" (unknown cause)
│ └─ Start with time-profiler.md, then memory-profiling.md
│
└─ Pre-release performance audit
└─ Read ALL reference files, use Review Checklist belowWhat performance problem are you investigating?
│
├─ App hangs / stutters / dropped frames / slow UI
│ └─ Read time-profiler.md
│
├─ High memory / leaks / OOM crashes / growing footprint
│ └─ Read memory-profiling.md
│
├─ Slow app launch / time to first frame
│ └─ Read launch-optimization.md
│
├─ Battery drain / thermal throttling / background energy
│ └─ Read energy-diagnostics.md
│
├─ General "app feels slow" (unknown cause)
│ └─ Start with time-profiler.md, then memory-profiling.md
│
└─ Pre-release performance audit
└─ Read ALL reference files, use Review Checklist below| Problem | Instrument / Tool | Key Metric | Reference |
|---|---|---|---|
| UI hangs > 250ms | Time Profiler + Hangs | Hang duration, main thread stack | time-profiler.md |
| High CPU usage | Time Profiler | CPU % by function, call tree weight | time-profiler.md |
| Memory leak | Leaks + Memory Graph | Leaked bytes, retain cycle paths | memory-profiling.md |
| Memory growth | Allocations | Live bytes, generation analysis | memory-profiling.md |
| Slow launch | App Launch | Time to first frame (pre-main + post-main) | launch-optimization.md |
| Battery drain | Energy Log | Energy Impact score, CPU/GPU/network | energy-diagnostics.md |
| Thermal issues | Activity Monitor | Thermal state transitions | energy-diagnostics.md |
| Network waste | Network profiler | Redundant fetches, large payloads | energy-diagnostics.md |
| 问题 | 工具/Instrument | 关键指标 | 参考文档 |
|---|---|---|---|
| UI卡顿超过250ms | Time Profiler + Hangs | 卡顿时长、主线程堆栈 | time-profiler.md |
| CPU占用过高 | Time Profiler | 各函数CPU占比、调用树权重 | time-profiler.md |
| 内存泄漏 | Leaks + Memory Graph | 泄漏字节数、循环引用路径 | memory-profiling.md |
| 内存持续增长 | Allocations | 活跃字节数、代际分析 | memory-profiling.md |
| 启动缓慢 | App Launch | 首帧时间(main前 + main后) | launch-optimization.md |
| 电池耗电快 | Energy Log | 能耗影响分数、CPU/GPU/网络占用 | energy-diagnostics.md |
| 发热问题 | Activity Monitor | 热状态转换 | energy-diagnostics.md |
| 网络资源浪费 | Network profiler | 冗余请求、大载荷数据 | energy-diagnostics.md |
os_signpostos_signpost| Setting | What It Catches |
|---|---|
| Main Thread Checker | UI work off main thread |
| Thread Sanitizer | Data races |
| Address Sanitizer | Buffer overflows, use-after-free |
| Malloc Stack Logging | Memory allocation call stacks |
| Zombie Objects | Messages to deallocated objects |
| 设置 | 检测内容 |
|---|---|
| Main Thread Checker | 主线程外的UI操作 |
| Thread Sanitizer | 数据竞争 |
| Address Sanitizer | 缓冲区溢出、野指针访问 |
| Malloc Stack Logging | 内存分配调用堆栈 |
| Zombie Objects | 向已释放对象发送消息 |
import MetricKit
final class PerformanceReporter: NSObject, MXMetricManagerSubscriber {
func startCollecting() {
MXMetricManager.shared.add(self)
}
func didReceive(_ payloads: [MXMetricPayload]) {
for payload in payloads {
// Launch time
if let launch = payload.applicationLaunchMetrics {
log("Resume time: \(launch.histogrammedResumeTime)")
}
// Hang rate
if let responsiveness = payload.applicationResponsivenessMetrics {
log("Hang time: \(responsiveness.histogrammedApplicationHangTime)")
}
// Memory
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)")
}
}
}
}
}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("恢复时间: \(launch.histogrammedResumeTime)")
}
// 卡顿率
if let responsiveness = payload.applicationResponsivenessMetrics {
log("卡顿时间: \(responsiveness.histogrammedApplicationHangTime)")
}
// 内存
if let memory = payload.memoryMetrics {
log("峰值内存: \(memory.peakMemoryUsage)")
}
}
}
func didReceive(_ payloads: [MXDiagnosticPayload]) {
for payload in payloads {
if let hangs = payload.hangDiagnostics {
for hang in hangs {
log("卡顿: \(hang.callStackTree)")
}
}
}
}
}.preparingThumbnail@MainActor.preparingThumbnail@MainActorselfautoreleasepoolselfautoreleasepoolinit()@main App@main Appinit()BGProcessingTaskRequest.besttoleranceBGProcessingTaskRequest.besttolerance