얼마전 python-dev메일링에 올라온 “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옵션으로 풀어놓고 좀 더 연구를 해 봐야겠습니다. -ㅇ-;
그러니까 결론은… Free-BSD port default가 가장 나쁘다는거죠? 긁적긁적 6–;;;
FreeBSD 포트의 디폴트가 딱히 나쁘다는 말은 아닙니다. FreeBSD 디폴트가 낮게 나오는 것은, 전체 포트의 기본 CFLAGS를 /etc/make.conf에서 중앙 통합해서 관리하는 기본 정책때문입니다.
Gentoo Linux가 -O3를 디폴트로 쓰는 것이 정책이듯, FreeBSD에서는 -O를 디폴트로 쓰는 것이 정책입니다. 둘 다 물론 사용자가 원하는 경우 쉽게 바꿀 수 있도록 되어있죠.
이 flag에 따라 문제가 있는 포트가 있기 때문에 기본이 -O인거 아닌가요? 하지만 웬만한 포트에는 WITH_OPTIMIZED_FLAGS 로 따로 설정?을 해줄 수 있으니 크게 문제는 안되지 않을까 생각합니다만… 뭐 저야 정확히는 모르겠습니다;;
-Os가 빠르다니 담부턴! -ㅇ-
헙.. 표만 가지고.. 살짝쿵 걸어본.. 농담인데..
상세한 답변 감사.. ^^;
제가 요즘 좀 할일이 없나봅니다.. 이런 얼토당토 않은 리플을 달다니… Good day요~
와락~ 1등이요
아히 전 2등 -o-