앱의 전력 사용량 프로파일링 및 최적화하기 (Profile and optimization power usage in your app) - WWDC25
앱의 전력 사용량 프로파일링 및 최적화하기 (Profile and optimization power usage in your app) - WWDC25
안정성에 중요한 요소 중 하나가 배터리 수명.
목차
- Debug reproducible issues
- 쉽게 재현할 수 있는 문제부터 해결해 볼 예정이며, 실제 사례를 통해 과도한 전력 사용을 식별하고 줄이는 방법을 확인.
- Uncover hidden issues
- 좀 더 어렵고 구체적인 실제 상황을 파악하는 방법을 알아보고, 어떤 환경에서든 데이터를 수집하는 방법을 알아볼 것
- Compare power usage
- 코드 구현에 따라 전력 소비에 대해서 비교해보며 앱의 효율성을 측정하고 개선하는 명확한 방법을 알아볼 것
- Optimization proactively
- 개발 과정 초기에 전력 문제를 사전에 감지하여고, 앱을 고도로 최적화된 버전을 제공하는 방법에 대해서 설명
Debug reproducible issues
Xcode에서 높은 에너지를 사용하는 것을 발견했지만 근본적인 원인을 찾는것은 매우 어려움.
이런 상황에서는 실제로 앱을 실행해 문제를 재현하고 전력 측정 항목을 기록하는 것임
Instruments의 Power Profiler는 이를 위한 완벽한 도구임.
앱의 프로파일을 작성하고 전력 추적을 기록한 후 Instruments에서 시각화할 수 있음.
CPU 사용량이 증가하면, 성능 저하와 배터리 수명 단축으로 이어짐.
Power Profiler와 CPU Profiler를 선택하고 진행
- 참고로 iOS 26 (iOS 19) 이하는 사용할 수 없음.
Command + Control + Z를 눌러 기록된 영역어 초점을 맞춘 후 Power Profiler를 확장.
Power Profiler를 사용하면 시스템 수준 전력 사용 항목과 각 앱별로 전력 영향 측정 항목에 모두 접근할 수 있음
Power Profiler의 처음 부분은
- 전반적인 에너지 소비량을 나타내는 시스템 전력 사용. 값이 높을수록 앱이 사용하는 전력이 높아짐
- Range를 서택하여 평균 에너지 사용량을 검사할 수 있음
이후에는 앱이 전력에 미치는 영향에 대한 지표들을 검토하는 것임.
Subsystem들과 연관지어 여러가지 측정 항목을 검사할 수 있음.
- 예를들면 CPU, GPU, 디스플레이, 네트워킹 등이 영향을 미침
특히 CPU Power Impact는 사용량이 높을수록 전력 소비가 크게 증가하므로 매우 중요함.
지속적이거나 집중적인 CPU 사용은 전력 사용량을 직접적으로 증가시킴. 라이브러리 창을 열려고 한 직후에
해당 예제에서는 탭을 바꿀때 CPU 사용량이 급격하게 증가하여 전력 사용량도 급격히 증가.
스파이크가 발생한 지점에 Range를 주어 평균값을 조사해보고자 함.
이전에는 평균값이 1인데, 스파이크 부분은 21로 급격히 증가함.
예상치 못한 전력 급증이 발생하는 경우를 식별하고 영향이 가장 큰 하위 시스템의 디버깅을 우선순위로 지정할 수 있는 지표임.
Time Profiler는 어떤 기능이 CPU 시간을 가장 많이 소모하는지 식별해서 CPU 오버헤드의 원인을 정확히 찾아내는데 도움이 됨.
이후에는 CPU Profiler를 열고 CallTree에서 시스템 라이브러리 숨겨서 분석함.
- Hide System Libraries
예제에서는 VideoCardView에서 상당한 시간이 소요됨.
해당 뷰의 body는 단순해서 문제는 View가 자주 호출되는지 발생한 가능성이 높음.
위 코드에서는 이미지를 여러번 만드는데 VStack으로 앱 진입시 모두 한번에 로드하여 이미지가 수십장일 경우 문제가 발생할 수 있음.
즉, 이는 비효율적이며 Instruments에서 발결한 높은 CPU 사용량의 원인이 될 수 있음.
앱은 아직 필요하지도 않은 콘텐츠를 로딩하는데 너무 많은 작업을 수행.
해당 케이스에서는 VStack을 LazyVStack으로 대체하는 것으로 해결 가능함.
이전보다 더 평균이 전력 사용량이 줄어들었음.
Power Profiler는 어떤 시스템이 앱의 전력 소비에 대한 통찰력을 제공.
문제가 있다고 의심되거나 어떤 하위 시스템에 집중해야 할지 또는 무엇으로 최적화해야 할지 확신할 수 없을때 이용.
해당 방법은 통제된 테스트에는 유용하지만 항상 전체적인 상황을 보여주는 것은 아님.
매우 간헐적으로 나타나는 문제나, 해당 상황을 재현하기 어려운 경우에는 어떻게 할까?
CarPlay에서 탐색하는 동안 앱이 실제로 어떻게 동작하는지 궁금하거나
AR 기능이 얼마나 많은 전력을 소모하던가
시간이 지나서야 나타나는 백그라운드 배터리 사용량은 어떻게 디버깅할까?
QA팀이 전력 진단을 쉽게 할 수 있는 방법은?
이러한 문제를 해결하려면 Xcode에 직접 연결하지 않고도 실제 상황에서 데이터를 수집할 수 있는 방법이 필요함.
Power Profiler는 기기에서도 사용할 수 있으며, 개발 중에는 재현할 수 없는 문제를 찾는 데 사용할 수 있음.
나한테는 재현되지 않는데, 배터리가 많이 소모되는 현상이 있음.
Power Profiling 덕분에 실제 기기 없이도 찾아볼 수 있음.
설정 앱에서 개발자 모드 켜기 (기기를 Xcdoe에 연결한 후에 사용할 수 있음)
- 그 다음에 Performace Trace로 이동
- 성능 추적이 활성화되면 Power Profiler를 활성화하는 옵션이 존재함. (해당 기능을 활성화)
- 다음으로 프로파일링할 앱을 지정
- Xcode의 TestFlight 또는 엔터프라이즈 프로그램을 통해 설치된 앱만 모니터링할 수 있음.
- Monitored apps에서 모니터링할 앱을 활성화
- 제어센터를 열어서 전력 측정 모니터링 활성화
- 이를 활성화하면 몇 시간동안 작업을 실행하면서 추적할 수 있음.
- 문제가 재현될 때까지 실행할 수 있음.
- 제어 센터에서 성능 추적 아이콘을 다시 탭하면 종료할 수 있음.
- 종료할 경우 모든 전력 측정 항목을 포함하는 추적 파일이 생성되고, 이 파일을 Mac과 공유하고 Instruments에서 직접 열 수 있음.
이후 Instrument를 켜면 몇 시간 동안 기록을 볼 수 있음. 해당 모드를 활용할 경우 프로파일러는 샘플링 속도를 낮춤.
샘플 앱 결과를 분석해 보자면 CPU 전력 영향은 CPU 영향이 뚜렷하게 나타나는 패턴을 보여주는데, CPU 영향이 큰 영역과 CPU 영향이 작은 기간이 주기적으로 반복적으로 나타남.
큰 영향을 미치는 영역 중 하나를 확대하면, 전력 사용의 원인을 알아낼 수 있음.
Time Profiler를 통해 확인해보고자 함.
위의 예시에서 문제가 되는 코드는 위치가 변할 때마다 호출되는 코드라서 책상에 앉아서 개발할 때 잡을 수 없는 코드임.
파일 I/O와 JSON의 디코딩하는 작업은 특히 파일 사이즈가 큰 경우에 리소스를 많이 소모하는 작업임.
해당 예제에서는 앱은 위치가 바뀔 때마다 이런 작업을 반복함.
여기서 최적화하는 방법은 `suggessionRulesMap`을 한번만 로드하고 json을 캐시하는 것임.
앱에서 이러한 변경을 할때마다 동일한 조건에서 테스트를 의로해 새로운 전력 관련 트레이싱이 가능함.
가장 중요한 점은 코드를 변경하는 과정에서 새로운 전력 문제가 발생하지 않았는지 점검하는 것임.
다양한 최적화 전략에 대해서 비교해보고자 함.
최적화를 위해서는 균형이 필요할 것임. 즉, CPU사용량은 줄어들지만, 네트워크 활동이 더 많아질 수도 있음.
순수하게 배터리 수명에 미치는 효과를 알기 위해서는 여러가지 접근 방식을 비교
- 접근 방식 1로 구현이 완료되었다고 가정하고, 간단하고 적은 양의 데이터로 테스트를 진행하면 효율적일 것으로 보임.
- 하지만 동료가 접근방식 2를 제안하고, 구조가 다르고 조금 더 복잡할 수도 있고, 데이터 수가 적을 때 속도가 조금 더 느릴 수 있지만 훨씬 더 원활하게 대량의 데이터를 처리하도록 설계
여기서 딜레마에 빠지게 되는데 어떤게 더 좋을까?
- 단순하게 로컬테스트나 코드 검사만으로 이를 결정하는 것은 정말 어려움.
- 로컬 테스트 결과는 일반적으로 발생하는 데이터 크기를 나타내지 않거나 네트워크 조건, 백그라운드 활동 등이 성능에 미치는 영향을 나타내지 않을 수도 있음.
이 지점에서 Power Profiler를 활용해 두 가지 접근 방식을 비교해서 어떤게 더 나은지 비교할 수 있음.
발열, 디바이스 상태, 시스템 압박 등이 최종적으로 얼마나 많은 전력을 사용했는지에 영향을 미칠 수 있음.
여기에는 앱의 상태 (관리하는 데이터 양, 활성
이러한 변수를 고려하려면 다양한 조건에서 각 접근 방식을 여러 번 실행한 다음 결과의 평균을 구한 다음 해당 데이터를 사용하여 기능 및 구현에 대한 의사 결정을 내리고 궁극적으로 최상의 환경을 위해 앱을 최적화 할 수 있음.
Power Profiler는 선택할 수 있는 하나의 옵션 중 하나임
테스트코드, App Connect API, MetricKit 등을 활용해 자동화하고 개발 프로세스에 활용해 강력한 에너지 효율 전략을 구축할 수 있음.
(참고)
https://www.youtube.com/watch?v=vccG9jw83I4