Profiling

프로파일링은 느린 줄을 찾기 전에 측정 질문 고정

성능 도구는 숫자를 주지만 어떤 질문으로 측정했는지가 더 중요하다. CPU 시간, 할당, 캐시, 대기 시간을 분리해야 최적화 방향이 흔들리지 않는다.

01

기준선 생성

릴리스 빌드, 대표 입력, 반복 횟수, 측정 장비를 고정해 비교 가능한 baseline을 둔다.

02

가설을 세운다

느린 함수, 잦은 할당, lock 대기, cache miss 중 무엇이 병목인지 도구로 확인한다.

03

작게 바꾸고 재측정한다

최적화 하나가 전체 지표를 얼마나 바꾸는지 확인하고 다음 변경으로 넘어간다.

sampling
어디서 시간이 쓰였는가 주기적으로 call stack을 샘플링해 hot path를 보여 준다.
짧은 함수는 누락될 수 있다.
instrumentation
정확한 구간 측정 코드에 측정 지점을 넣어 함수별 비용을 더 자세히 본다.
측정 자체의 비용이 있다.
heap profile
할당 추적 new, vector growth, string copy가 얼마나 자주 일어나는지 본다.
reserve와 object pool 후보를 찾는다.
flame graph
시각적 hot path 넓은 막대가 누적 시간이 큰 호출 경로다.
막대 높이는 호출 깊이다.

릴리스 빌드 · 대표 입력 · 회귀 점검

릴리스 빌드 디버그 빌드 결과로 최적화 결정을 하고 있지 않은가.
대표 입력 작은 예제에서 빠른 코드가 실제 입력에서도 같은 병목을 보이는가.
회귀 성능 개선이 정확성, 메모리, 지연 시간 중 다른 지표를 망치지 않는가.

측정 질문

// 목표: p95 latency를 40ms 이하로 낮춘다.
// 고정: release build, production-sized input, 30 runs.
// 관찰: CPU samples, allocations, lock wait time.