핵심 요약
- 컴파일러 개발자가 피보나치 재귀 벤치마크 성능을 비교하던 중 GCC의 비정상적으로 빠른 속도를 분석했습니다.
- GCC의 어셈블리 분석 결과 재귀 호출 중 하나를 인라인화하여 루프로 변환해 호출 횟수 자체를 줄여버린 벤치마크용 꼼수가 발견되었습니다.
- 정석대로 두 번 호출한 Clang과 달리 GCC가 마이크로벤치마크를 무력화하는 최적화를 적용했음을 보여줍니다.
요약 GNU Guile 컴파일러 개발자가 피보나치 수열 재귀 함수(fib)를 이용해 Guile의 네이티브 코드 생성 성능을 다른 컴파일러들과 비교 분석한 글입니다.
저자는 피보나치 재귀 마이크로벤치마크가 일종의 바이올린 기초 연습곡처럼 실제 프로그램으로서의 가치는 없지만 재귀 함수 호출 성능을 측정하고 개선하는 용도로 쓰인다고 설명합니다. 측정 결과 Guile 자체는 버전이 올라가며 크게 빨라졌으나, GCC 및 Clang(LLVM), OCaml, Go 등 정적 컴파일러와 비교했을 때 흥미로운 차이가 발견되었습니다.
특히 GCC는 0.304초라는 압도적인 속도를 기록했는데, 어셈블리 코드를 뜯어보니 재귀 호출 중 하나를 인라인화하여 루프로 변환하는 꼼수를 부린 것으로 확인되었습니다. 마이크로벤치마크 특유의 호출 횟수를 임의로 줄여버림으로써 벤치마크 수치를 인위적으로 끌어올린 것입니다. 반면 Clang은 정석적인 재귀 호출 어셈블리를 생성했습니다. 또한 V8 WebAssembly의 경우 커스텀 호출 규약과 스택 검사 루틴이 추가된 형태로 컴파일되는 등 각 컴파일러별 최적화 방식의 차이가 상세히 다뤄집니다.
Sponsored · 광고