최적화의 원칙
성능 최적화는 측정에서 시작합니다. 40년간 성능 튜닝을 해온 저로서는 '추측하지 말고 측정하라'가 황금률이라고 강조합니다. 도날드 크누스의 '섣부른 최적화는 모든 악의 근원'도 기억하세요. 먼저 올바르게 작동하게 하고, 병목을 찾아 최적화합니다.
프로파일링
프로파일러로 어디서 시간이 소비되는지 찾습니다. CPU 프로파일러는 함수별 실행 시간을 보여줍니다. 메모리 프로파일러는 할당과 누수를 찾습니다. 언어별 도구: Python(cProfile, Py-Spy), JavaScript(Chrome DevTools), Java(JProfiler, async-profiler). 핫스팟(전체 시간의 대부분을 차지하는 부분)에 집중합니다.
알고리즘 최적화
가장 큰 성능 개선은 알고리즘 변경에서 옵니다. O(n²)를 O(n log n)으로 바꾸면 극적으로 빨라집니다. 적절한 자료구조를 선택합니다. 해시맵의 O(1) 조회 vs 리스트의 O(n) 조회. 불필요한 연산을 제거합니다. 캐싱으로 중복 계산을 피합니다.
저수준 최적화
알고리즘이 최적이면 저수준 최적화를 고려합니다. 메모리 접근 패턴을 개선합니다(캐시 친화적). 불필요한 메모리 할당을 줄입니다. 문자열 연결 대신 StringBuilder를 사용합니다. 루프 언롤링, 분기 예측 힌트는 대부분 컴파일러가 처리합니다. 저수준 최적화는 측정 후 필요할 때만 합니다.
성능 테스트와 회귀 방지
벤치마크로 성능을 측정합니다. 통계적으로 유의미한 결과를 얻습니다(여러 번 실행). CI에서 성능 테스트를 실행하여 회귀를 방지합니다. 성능 목표(SLO)를 정의합니다. 실제 환경과 테스트 환경의 차이에 주의합니다. 최적화도 유지보수 비용이 있으므로 필요한 만큼만 합니다.
댓글
0