bionote.net

[C++] compile optimization - 최적화 옵션의 힘


C로 작성된 alignment 프로그램을 C++로 다시 작성해서 연구에 사용하고 있다. 기본적인 알고리즘은 동일하지만 OOP에 맞게 설계가 변경되서 코드의 재사용성을 높일 수 있고, 프로그램을 유지보수하기도 상당히 편해졌다. 하지만 문제점이 있었으니 그것은 내가 작성한 C++ 프로그램의 수행속도가 상당히 느리다는 것이다. 원래 C 프로그램과 새로 작성한 C++ 프로그램의 수행시간을 비교하면 다음과 같다.
]$ time original_c_program
real 0m0.021s
user 0m0.007s
sys 0m0.005s

]$ time redesigned_cpp_program
real 0m0.584s
user 0m0.567s
sys 0m0.007s

위의 결과에서 같이 상당한 속도차이를 확인할 수 있다.
C++ 프로그램에서 내부적으로 STL과 자체적으로 작성한 클래스들을 연동해서 사용하기 때문에 라이브러리를 링크하는데 오버헤드가 발생할 것이라고 예측하고 static link 옵션(-static)을 주고 컴파일하고 다시 수행시간을 측정하였다.
]$ time static_cpp_program
real 0m0.333s
user 0m0.162s
sys 0m0.007s

위의 결과와 같은 성능 향상을 얻을 수 있었다. 여기서 성능향상은 라이브러리를 링크하는데 걸리는 시간이 사라지면서 얻어진 것으로 생각된다. 특별히 테스트를 수행한 시스템이 NFS로 홈디렉토리와 라이브러리가 있는 디렉토리를 마운트하고 있기 때문에 network상에서 소비하는 시간도 상당히 절약되었을거라고 생각된다.
하지만 정적인 라이브러리 링크에도 불구하고, 여전히 원래 C 프로그램에 비해서 느린 수행속도를 보인다. 그래서 -static 옵션과 동시에 g++의 최적화 옵션(-O3)을 사용해서 컴파일하고 수행시간을 측정해 보았다.
$ time static_optimize_cpp_program
real 0m0.013s
user 0m0.009s
sys 0m0.003s

위의 결과에서 볼 수 있듯이 기존의 C++ 프로그램은 물론이고 원래 C 프로그램보다도 나은 수행속도를 보여준다. (참고로 원래 C 프로그램은 -static -O3 옵션으로 컴파일 된 것이다.)

하나의 기준과 제한된 환경에서 행해진 것이라는 한계가 있지만, 위의 결과를 종합해 보면 다음과 같은 결론을 내릴 수 있다.
1) C++ 프로그램은, 특히 STL을 사용했을 시에는, 컴파일시에 최적화를 반드시 수행해야한다.
2) 기존 프로그램을 리팩토링하거나 다른 플랫폼으로 포팅하였을 때는 반드시 성능평가를 통해서 검증할 필요가 있다.
2006/01/17 20:26 2006/01/17 20:26
top

TRACKBACK ADDRESS :: http://bionote.net/tt/blna999/trackback/69

Leave a comment..