[Instruments 맛보기] 배터리 수명 및 성능 향상시키기

2025. 9. 15. 22:04·iOS/Instruments
반응형


🏁 학습할 내용

  • 베터리 수명 지표
  • MetricKit
  • 성능 지표

🔋배터리 수명 지표

 

중요한 몇가지 지표만 설명됨

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

🚀 성능 지표

 

  • 행
    • 사용자 입력에 응답하지 않는 시간의 히스토그램
    • 정말 심각하고 중요한 지표
    • 무거운 작업을 메인 스레드에서 옮겨야함
  • 디스크
    • 필요할 때만 사용해야하는 리소스
    • 가능한 디스크 사용량을 정량화
  • 메모리
    • Average Suspended memoery
      • 평균 일시중단 메모리
    • Peak Memory
      • 최대 메모리
    • 메모리는 앱 실행시간에 영향을 줄 수 있다.

🧪 XCTest를 이용해, UI 테스트 시 더 많은 지표 제공

 

⛳️ 베이스 라인 설정

베이스라인을 설정하여, 베이스라인이 넘어가면 테스트가 실패하게 만들 수 있다.


📈 MetricKit

 

🎉 등장 계기

광범위한 사용자 시나리오

  • 셀룰러 네트워크, 신호 상태, 기기 종류 등 사용자 시나리오는 굉장히 광범위하다.
  • 그로인해, 현장 테스트에서 발견되지 않는 문제를 파악하는 데 어려움이 있다.

 

이전 코드와 비교가 현재 코드의 성능 비교

  • 배터리 수명 및 성능을 이전 버전과 비교할 수 있어야한다.
  • 또한 지표를 토해, 심각한 문제를 미리 발견하고 해결할 수 있다.

 

⭐️ 역할

배터리 소비 및 앱 성능 데이터를 수집하고 분석을 위한 온디바이스 프레임워크

 

 

📮Metrics Payload 받기

  1. MXMetricManagerSubscriber 프로토콜을 채택한 후, manager를 등록한다.
  2. 이후 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
'iOS/Instruments' 카테고리의 다른 글
  • [Instruments 맛보기] Swift Concurrency 시각화 및 최적화하기
  • [Instruments 맛보기] HTTP 트래픽 분석
  • [Instruments 맛보기] 훌륭한 프로파일링 경험
  • [Instruments 맛보기] 프롤로그
Hamp
Hamp
남들에게 보여주기 부끄러운 잡다한 글을 적어 나가는 자칭 기술 블로그입니다.
  • Hamp
    Hamp의 분리수거함
    Hamp
  • 전체
    오늘
    어제
    • 분류 전체보기 (297)
      • CS (29)
        • 객체지향 (2)
        • Network (7)
        • OS (6)
        • 자료구조 (1)
        • LiveStreaming (3)
        • 이미지 (1)
        • 잡다한 질문 정리 (0)
        • Hardware (2)
        • 이론 (5)
        • 컴퓨터 그래픽스 (0)
      • Firebase (3)
      • Programing Langauge (36)
        • swift (31)
        • python (4)
        • Kotlin (1)
      • iOS (131)
        • UIKit (37)
        • Combine (1)
        • SwiftUI (32)
        • Framework (7)
        • Swift Concurrency (22)
        • Tuist (6)
        • Setting (10)
        • Modularization (1)
        • Instruments (6)
      • PS (59)
        • 프로그래머스 (24)
        • 백준 (13)
        • LeetCode (19)
        • 알고리즘 (3)
      • Git (18)
        • 명령어 (4)
        • 이론 (2)
        • hooks (1)
        • config (2)
        • action (7)
      • Shell Script (2)
      • Linux (6)
        • 명령어 (5)
      • Spring (9)
      • CI-CD (4)
      • Android (0)
        • Jetpack Compose (0)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    SwiftUI
    GIT
    투포인터
    lifecycle
    protocol
    dispatch
    Swift
    concurrency
    Tuist
    Network
    IOS
    dp
    프로그래머스
    백준
    UIKit
    AVFoundation
    property
    dfs
    boostcamp
    CS
  • 최근 댓글

  • 최근 글

  • 반응형
  • hELLO· Designed By정상우.v4.10.0
Hamp
[Instruments 맛보기] 배터리 수명 및 성능 향상시키기
상단으로

티스토리툴바