최적화의 양면

얼마전 python-dev메일링에 올라온 [WWW]“Who cares about the performance of these opcodes?”에 대한 amk의 답변에 -O3보다 -Os가 더 빠르다는 글을 보고 몇가지 테스트를 해 봤습니다. 파이썬 바이트 코드를 실행하는 Python/ceval.c는 거의 1000라인에 육박하는 switch-case문으로 구성되어있는데, 요즘 LIST_APPEND같은 특화된 옵코드를 계속 추가하면 전체적으로 switch-case가 느려지지 않겠느냐하는 글에 딸려 나온 것입니다.

오오. 그런데, 테스트를 해 보니 정말로 amk 말 대로 ceval을 -Os로 컴파일한 것이 더 빠른 것이었습니다.

Pentium3 550

Pentium4 Xeon 2.4G

-O3로 전부 (Python 기본 배포 디폴트)

12284

23616

ceval만 -Os

12379

23970

-Os로 전부

11615

18713

-O로 전부 (FreeBSD 포트 디폴트)

11594

이야. 캐쉬 히트나 브랜치 프리딕션 히트 때문인 것인지 궁극의 최적화 옵션 -O3보다 비실비실 -Os가 더 빠른 것입니다! 이건 단순히 1%도 안 되는 성능 향상을 컴파일 옵션으로 얻을 수 있다는 뭐 그런 의미보다는 switch-case문만 잘 줄이면 속도를 더 빨리 만들수 있다는 것을 암시해 주는 것! JIT를 사용하지 않는 파이썬 VM에서는 옵코드 개수가 역시 속도에 큰 영향을 미친다는 것이군요.

요즘 Raymond가 리스트, 딕셔너리, 컴파일러 등등 여러가지 최적화를 해서 정말 파이썬 2.4는 1.5 속도를 따라잡고 멋진 릴리즈가 되지 않을까 하는군요. 기대가 됩니다. :) 그리고, 컴퓨터 아키텍처 책 말고 실전에서도 코드 크기가 영향을 미친다는 것도 신비롭네요. -S옵션으로 풀어놓고 좀 더 연구를 해 봐야겠습니다. -ㅇ-;

6 thoughts on “최적화의 양면”

  1. FreeBSD 포트의 디폴트가 딱히 나쁘다는 말은 아닙니다. FreeBSD 디폴트가 낮게 나오는 것은, 전체 포트의 기본 CFLAGS를 /etc/make.conf에서 중앙 통합해서 관리하는 기본 정책때문입니다.
    Gentoo Linux가 -O3를 디폴트로 쓰는 것이 정책이듯, FreeBSD에서는 -O를 디폴트로 쓰는 것이 정책입니다. 둘 다 물론 사용자가 원하는 경우 쉽게 바꿀 수 있도록 되어있죠.

  2. 이 flag에 따라 문제가 있는 포트가 있기 때문에 기본이 -O인거 아닌가요? 하지만 웬만한 포트에는 WITH_OPTIMIZED_FLAGS 로 따로 설정?을 해줄 수 있으니 크게 문제는 안되지 않을까 생각합니다만… 뭐 저야 정확히는 모르겠습니다;;
    -Os가 빠르다니 담부턴! -ㅇ-

  3. 헙.. 표만 가지고.. 살짝쿵 걸어본.. 농담인데..
    상세한 답변 감사.. ^^;
    제가 요즘 좀 할일이 없나봅니다.. 이런 얼토당토 않은 리플을 달다니… Good day요~

Comments are closed.