
🏁 학습할 내용
- 베터리 수명 지표
- MetricKit
- 성능 지표
🔋배터리 수명 지표

중요한 몇가지 지표만 설명됨
- 프로세싱 지표
- CPU 및 GPU 시간
- 예상치 못한 랜더링
- 퓨처의 알고리즘
- 위치 지표
- 누적 사용량
- 정확도 버킷
- 백그라운드 위치 사용량
- 디스플레이 지표
- APL(Average Pixel Luminance
- 평균 픽셀 휘도(단위 명적당 발산하는 빛의 양)
- 밝은 색상을 많이 사용할수록, 배터리 사용량이 높아짐
- 네트워킹 지표
- 업로드 및 다운로드 바이트 지표
- 연결 지표
- 네트워크는 고에너지를 소모하는 하위 시스템
🚀 성능 지표

- 행
- 사용자 입력에 응답하지 않는 시간의 히스토그램
- 정말 심각하고 중요한 지표
- 무거운 작업을 메인 스레드에서 옮겨야함
- 디스크
- 필요할 때만 사용해야하는 리소스
- 가능한 디스크 사용량을 정량화
- 메모리
- Average Suspended memoery
- 평균 일시중단 메모리
- Peak Memory
- 최대 메모리
- 메모리는 앱 실행시간에 영향을 줄 수 있다.
- Average Suspended memoery
🧪 XCTest를 이용해, UI 테스트 시 더 많은 지표 제공
⛳️ 베이스 라인 설정

베이스라인을 설정하여, 베이스라인이 넘어가면 테스트가 실패하게 만들 수 있다.
📈 MetricKit
🎉 등장 계기
광범위한 사용자 시나리오
- 셀룰러 네트워크, 신호 상태, 기기 종류 등 사용자 시나리오는 굉장히 광범위하다.
- 그로인해, 현장 테스트에서 발견되지 않는 문제를 파악하는 데 어려움이 있다.
이전 코드와 비교가 현재 코드의 성능 비교
- 배터리 수명 및 성능을 이전 버전과 비교할 수 있어야한다.
- 또한 지표를 토해, 심각한 문제를 미리 발견하고 해결할 수 있다.
⭐️ 역할
배터리 소비 및 앱 성능 데이터를 수집하고 분석을 위한 온디바이스 프레임워크
📮Metrics Payload 받기
- MXMetricManagerSubscriber 프로토콜을 채택한 후, manager를 등록한다.
- 이후 didReceive함수에서 payload를 소비한다.
import MetricKit
final class MetricsSubscriber: NSObject, MXMetricManagerSubscriber {
var manager: MXMetricManager?
override init() {
super.init()
manager = MXMetricManager.shared
manager?.add(self)
}
deinit {
manager?.remove(self)
}
// 여기서, 파일로 저장하든, 서버에 저장하든, 소비하는 코드를 적으면 됨
func didReceive(_ payloads: [MXMetricPayload]) {
for payload in payloads {
print(payload)
}
}
}
실제 기기를 연결하여, 앱을 실한 후, Debug -> Simulate MetricKit Payloads를 누르면
didReceive쪽으로 payload가 꽂힌다.

OS는 하루 종일 앱 사용에 따른 성능 데이터를 수동적으로 수집한다.
이 데이터는 익명으로 처리되며, 개인정보를 보호하도록 설계되어 있음
payload의 단위는 24시간이다.
하루종일, 즉 지난 24시간 동안의 지표를 요약해서, 페이로드를 기기로 반환한다.


payload 결과를 보면, 다음과 같은 지표들이 도착한다.
- 앱 메타데이터
- 빌드 버전
- 기기 유형
- OS 버전
- 백그라운드 지표
- CPU 시간 및 GPU 시간
- 네트워킹
- 디스크 IO 메모리
- mxSignpost 요약

🚧 MetricKit 2.0 추가 사항
WWD20에서 추가된 내용을 첨부한다.
이전에 우리는 여러 지표들을 코드로 붙어 받았다.
func didReceive(_ payload: [MXMetricPayload]) {
for metricPayload in payload {
// Do something with metricPayload.
}
}
MetricKit 2.0에서는 단순 지표 뿐아니라, 유저 경험과 직접적인 연관이 있는 다양한 지표들을 제공한다.

이 때 해당 정보들은 다음 코드(MXDiagnosticPayload)로 들어온다.
func didReceive(_ payload: [MXDiagnosticPayload]) {
for diagnosticPayload in payload {
// Consume diagnosticPayload.
}
}

시스템은 MXMetricPayload와 MXDiagnosticPayload를 함께 묶어 사용할 수 있다.
🏰 구조


MXDiagnostic
- 모든 Diagnostic의 수퍼 클래스
- 애플리케이션의 메타데이터가 포함되어있음
MXDiagnosticPayload
- 모든 MXDiagnostic를 담고있는 carrier클래스

MXCallStackTree
- 기기 외부애서 사용 가능한 회귀시간 백트레이스를 캡슐화한 데이터 클래스
- unsymbolicated(심볼을 사용한 간접표현 x)
- 디바이스 외부에서도 사용 가능하도록 디자인 됨
- 위 사진처럼 JSON 변환하여, 다른 도구들과도 호환성이 종흠
- UUID, offset, name, frame address 같은 binary정보들을 확인할 수 있음
🍏 새롭게 등장한 MXDiagnostic의 서브 클래스
⏱️ MXHangDiagnostic

- Hang은 애플리케이션이 긴 시간동안, 사용자 입력에 응답하지 않을 떄 반결되는 현상
- 원인은 메인스레드 차단
- 메인스레드가 응답하지 않은 시간과 메인스레드 백트레이스를 제공
👾 MXCPUExceptionDiagnostic

- Xcode Organizer에서 에너지 로그로 호칭되는 로그
- CPU 사용 시간, 사용량이 높을 때 샘플링된 총 시간
- CPU 시간을 소비하는 스레드의 백트레이스
💾 MXDiskWriteExceptionDiagnostic

- Exception을 발생시키는 총 write 횟수
- 과도한 쓰기 유발한 쓰레드 백트레이스
- 일일 1GB 임계값을 초과할 떄 생성됨
💥 MXCrashDiagnostic

- 예외 정보
- 종료 이유
- 잘못된 acess에 대한 가상메모리 정보
- 충돌의 백트레이스
🔥 핫스팟 식별하기
let log: OSLog = MXMetricManager.makeLogHandle(category: "Example")
func apply() {
mxSignpost(.begin, log: log, name: "Apply")
... 코드
mxSignpost(.end, log: log, name: "Apply")
}
log를 생성한후, mxSignpost 함수를 이용하면, 다음과 같이, payload 마지막 mxSignpost 요약에 정리된다.

출처
https://developer.apple.com/videos/play/wwdc2019/417/
Improving Battery Life and Performance - WWDC19 - Videos - Apple Developer
Learn about new ways to find and fix performance issues during daily development, beta testing, and public release on the App Store...
developer.apple.com
https://developer.apple.com/documentation/MetricKit
MetricKit | Apple Developer Documentation
Aggregate and analyze per-device reports on exception and crash diagnostics and on power and performance metrics.
developer.apple.com
'iOS > Instruments' 카테고리의 다른 글
| [Instruments 맛보기] SwiftUI 성능 최적화 (0) | 2025.10.19 |
|---|---|
| [Instruments 맛보기] Swift Concurrency 시각화 및 최적화하기 (0) | 2025.09.23 |
| [Instruments 맛보기] HTTP 트래픽 분석 (0) | 2025.09.20 |
| [Instruments 맛보기] 훌륭한 프로파일링 경험 (0) | 2025.09.18 |
| [Instruments 맛보기] 프롤로그 (0) | 2025.09.13 |