[Instruments 맛보기] 프롤로그

👋 들어가기 전
더이상 미룰 수 없다..
회사에서 퍼포먼스를 개선했는 지, 안했는 지 판단하려고할 때, 객관적인 지표가 필요하다.
인스트러먼트 너!... 최대한 나중에 만나자 약속했지만, 내가 약속을 깼다.
이제 니가 필요해

Xcode Instruments 튜토리얼을 따라가면서, 초급딱지를 붙여보자..
Instruments 시리즈는 WWDC + tutorial을 중심으로 진행할려고한다.
🏁 학습할 내용
- WWDC19 Getting Started with Instruments 세션 정리
Instruments란?
들어가기 전
오리엔테이션에서 정곡을 찌르는 말이 있었다.
앱의 UI가 마음에 들어도, 배터리가 빨리 방전되거나, 반응성이 나쁘다면,
앱 사용 경험이 전반적으로 안 좋게 기억된다.
반응성은 사용자와 앱 간의 신뢰를 구축한다.
귀찮다는 이유로, Instruments를 깊게 사용하지 않았던 과거를 반성하게 된다.
Instruments는 이런, 반응성과 같은 전체적인 성능 측정(프로파일링) 도구다.
🪟 윈도우 모드
Instruments 역시, 시스템 자원을 사용한다.
그렇기 때문에, 앱 성능 측정시, 앱에 영향을 최소화하기위해
기록이 끝날 때까지, 결과를 분석 및 표시하지않고, 기록 마지막 몇 초 이전의 이벤트를 무시하는
모드를 바로 윈도우 모드라고한다.
이렇게 함으로써, 기록을 시작하고 문제 발견 시, 중지할 경우 유용하다.
또한, 짧은 시간 동안 많은 데이터를 수집하기 때문에, 기본적으로 이 모드를 사용한다.
📊 화면 구성
Track View

창 상단에 위치한다.
트랙에는 프로세스, 스레드, CPU 코어 같은 하나의 이벤트 소스에 대한 시계열 추적 데이터를 표시한다.
Filter

필터를 사용하면, 내가 원하는 정보만 표시할 수 있다.
Detail View

창 하단에 위치하며, 특정 트랙을 선태갛여, 각 스레드에서 호출된 함수를 살펴 볼 수 있다.
Extended Detail View(Right Side on DetailView)

Detail View의 우측편에는, 조금 더 풍부한 정보를 제공해주는데, 현재 선택된 트랙이 Time Profiler이기 떄문에
여기서는, 가장 많은 호출 스택(Heaviest Stack Trace)를 요약해서 보여준다.
또한, 시스템 프레임워크나 라이브러리에서 나온 프레임은 옅은 회색으로 표시된다.
Inspection Head

특정 시점에 발생하는 일을 확인할 떄 사용하며, DetailView 및 Extended Detail View은
선택한 이벤트에 대한 정보에 초점을 맞추도록 업데이트 된다.
📜 추적 문서
Instruments에 표시되는 내용들은 모두 추적 문서의 일부분이다.
추적 문서에는 프로파일링을 위해 구성된 모든 Instruments의 결과 분석에 사용되는 데이터 및 뷰가 포함되어있다.
Instruments는 추적 문서를 저장하고, 다시 열어 이전 결과를 살펴볼거나, 팀원과 공유하여 조사할 수 있도록 지원한다.
💁 Tip
1. 릴리즈 모드에서 프로파일링 해라.
- Xcode에서 빌드-실행 주기에, 컴파일러는 다양한 최적화를 지원하며, 빠른 처리를 위해 저수준 최적화를 사용
- 하지만 App Store에 올라가는 코드는 최적화 수준이 적용되지 않음
- 그러므로 Xcode Default Configuration을 사용시, 프로파일링은 릴리스에서 돌아감
- 하지만 custom compiler flag를 사용하고 있는 경우, 프로파일링하는 앱은 릴리스 compiler flag를 사용하는 지 확인
2. 실제 디바이스를 이용해라
- 시뮬레이터를 사용하여 프로파일링하면, mac의 리소스를 사용함
- 이 경우, Mac 리소스를 앱 자체에서 가져갔는지, 다른 프로그램이 가져갔는 지 필터링하기 매우 힘듬
⏰ Time Profiler

🎯 역할
다양한 작업에 소요되는 시간을 측정하기 위한 목적
✈️ 동작
운영 체제에서 제공하는 인프라를 사용하여, 고정 시간 간격으로 관련 스레드의 호출 스택을 수집
🚥 Signpost
🎯 역할
성능 측정값 기록
- Time Profiler는 일정 간격에 호출된 스택과 시간간의 상관 관계를 분석하여 통계 프로파일링을 구축
- 하지만, 상관관계는 코드의 실행 방식이나 이유를 알려줄 수 없음
- 실행 패턴을 구분하려면, 코드에서 정확한 측정값을 기록해야함
- 코드가 어떻게 그리고 왜 실행됐는 지를 알 수 있다.
✈️ 동작
- Instruments는 print문을 인식하지 못함
- 그렇기때문에,os_signpost를 이용
코드와 결과를 살펴보자.
import os.signpost
/// subsystem: 로그를 구분할 앱이나 프레임워크의 고유 식별자. 보통 번들 아이디
/// category: 해당 로그가 속하는 기능 영역
/// Instruments의 PointsOfInterest
static let log = OSLog(subsystem: "com.myapp.coo", category: .pointsOfInterest)
func abc() {
defer {
os_signpost(.end, log: CenterScaleSnapCollectionView.log, name: "HeavyOperation")
}
os_signpost(.begin, log: CenterScaleSnapCollectionView.log, name: "HeavyOperation")
}
로그 인스턴스를 만든 후, os_signpost에 전달해주면, 아래와 같이 Points of Interest에
우리가 검사하길 원한 abc 함수에 대한 로그가 남게된다.

출처
https://developer.apple.com/videos/play/wwdc2019/411/
Getting Started with Instruments - WWDC19 - Videos - Apple Developer
The Instruments app in Xcode provides a rich set of tools and templates for profiling your app performance. Learn all about Instruments...
developer.apple.com