최적화하기
[iOS - swift] 최적화 - Instruments로 행 분석하는 방법 (Analyze hangs with Instruments)
jake-kim
2025. 10. 15. 01:10
행이란?
- 사용자가 앱을 쓸 때 지연된다고 느껴지는 것
- 예) 사용자가 버튼을 누른 경우, 조금 있다가 반응한다는 느낌을 주는 것
- 애플에서 제공하는 가이드)

- 의미
| Instant | 즉각적인 | 반응이 바로 느껴질 정도로 빠름 (~100ms 이내) |
| Circumstantial | 상황에 따라 달라지는, 약간 느리지만 용인됨 | 약간의 지연(~250ms)은 사용자가 느끼지만 불편하지 않음 |
| Microhang | 미세한 멈춤 | 눈에 띄는 짧은 멈춤 (~500ms 미만) |
| Hang | 완전한 멈춤(먹통) | 반응이 끊기거나 멈춘 듯한 상태 (~500ms 이상) |
- 즉, 즉각적이려면 100ms 이내로 동작하게끔해야함
- 또 행의 기준은 500ms 이상 걸리는 동작을 의미함
행 파악하는 방법
- 위에서 알아본대로 500ms 이상 걸리는 작업을 행이라고 정의
- 이 행은 Instruments의 Time Profiler에서 확인이 가능
- Time Profiler 관련 기초 내용은 이전 포스팅 글 참고
(Instruemtns > Time Profiler 중 Hangs 부분)

- 여기서 보여지는 Severe Hang은 3.44초가 걸렸는데 단순히 오래걸린다는 의미에는 Too long 말고도 Too often도 존재
Main Thread가 바쁜 경우
- 3.44초가 걸린 행을 분석할때는 세 가지 관점으로 먼저 생각 필요
- 오래 걸림 (Too long)
- 자주 불림 (Too often)
- 메인스레드가 blocked 됨
- 이것을 어떻게 구분할 것인가?
- 우선 메인 스레드가 block된지 유무는 쉽게 파악이 가능
- hangs 부분의 하위의 Main Thread의 그래프를 보면 hang 시점에 그래프가 들쑥날쑥 보이는 것과 아예 그래프가 없는 것으로 확인이 가능

- 오래 걸림 vs 자주 불림 구분 방법
| 오래 걸림 (Too long) | 자주 불림 (Too often) | |
| Flame Graph | 가로로 긴 막대, 길게 이어짐 | 짧은 막대가 반복적으로 여러 곳에 흩어짐 |
| Call Tree | Calls 적음, Self Time 높음 | Calls 많음, Avg Time 낮음 |
| Timeline | 굵은 덩어리 하나로 CPU 점유 | 얇은 점들이 계속 반복, 일정한 패턴 |
- 코드 확인하는 방법: Time Profiler의 CPU Usage와 동일 (이전 포스팅 글 참고)
* 참고