C++ 코드 최적화1 - 소프트웨어 성능 향상

C++ 코드 최적화1 - 소프트웨어 성능 향상


코드 최적화(Optimization of Your Codes)


10.1 들어가며

10.2 당신의 소프트웨어를 최적화하기 전에

10.3 선언 배치(Declaration Placement)

10.4 인라인 함수들(Inline Functions)

10.5 메모리 사용을 최적화하기(Optimizing Memory Usage)

10.6 속도 최적화(Speed Optimizations)

10.7 최후의 수단(A Last Resort)

10.8 결론들(Conclusions)


10.1 들어가며

지난 30여 년 동안 자주 듣던 주장 중 하나는 이것이다.


성능은 하드웨어의 계산능력이 꾸준히 하강하고 있으므로 문제가 아니다.


그런 까닭에 성능이 더 좋은 컴퓨터를 사거나 이미 있는 컴퓨터의 RAM을 확장하면, 소프트웨어의 느린 부분을 커버할 수 있다.

다른 말로 하자면 하드웨어 업그레이드는 코드를 손수 조율하는 수고스러운 작업보다 더 효율적이다. 이 주장은 PC상에서 실행하는 클라이언트 애플리케이션들에 관해서만 맞다.


오늘날 합리적인 가격의 PC는 20여 년 전의 메인프레임보다 더 높은 계산능력을 제공하는데, 계산능력은 18개월마다 지수적으로 증가하고 있다. 그러나, 많은 다른 애플리케이션 영역들에서 하드웨어 업그레이드는 너무 비싸거나 단순히 옵션사항이 아니므로 덜 유리하다.


128K 또는 그 이하의 RAM을 갖는 전용 임베디드 시스템들에서 RAM을 확장하는 것은 새로운 칩들의 개발과 테스트에 몇 년의 시간을 투자해야 할 뿐만 아니라 전체 시스템을 처음부터 다시 재설계하는 것을 요구한다. 그렇기에 코드 최적화는 만족할만한 성능을 위한 유일한 실용적 선택이다.


최적화란 임베디드 시스템들이나 하드코어 실시간 애플리케이션들과 같은 내밀한 애플리케이션으로 한정되지 않는다. 재정 및 회계시스템들과 같은 주류 애플리케이션 영역들에서조차 코드 최적화는 항시 필요하다. 1,500,000달러 하는 메인프레임 컴퓨터를 소유하는 은행을 위하여 더 빠른 머신을 사는 것은 몇천 줄의 중요한 코드를 다시 작성하는 것 보다 덜 바람직하다.


소프트웨어 최적화 c++[C++ 속도 최적화] 소스 코드 개선


또한, 코드 최적화는 관계형 DB 관리 시스템과 웹 서버들 처럼 수많은 사용자를 지원하는 서버 애플리케이션들로부터 만족할 만한 성능을 획득하기 위한 방법이다.


또 다른 흔한 믿음은 코드 최적화가 가독성이 떨어지며 유지하기 더 어려운 소프트웨어를 의미한다는 것이다.

이것은 반드시 참인 것은 아니다. 때때로 소스 파일에서 선언들의 위치를 바꾸는 것 또는 다른 컨테이너 타입을 선택하는 것과 같은 단순한 코드 수정들은 전체를 전혀 달라지게 만들 수 있다.


아직도 이 변화 중 그 어떤 것도 가독성이 떨어지는 코드를 수반하지 않으며 어떤 추가적인 유지보수의 부담을 초래하지 않는다.


사실 최적화 기법 중 몇몇은 심지어 소프트웨어의 확장성과 가독성을 향상할 수 있다. 더 과감한 최적화들은 간결한 클래스 계층의 사용으로부터 인라인 어셈블리 코드의 조합에 이르기까지 다양하게 분포할 수 있다. 이러면 결과는 가독성이 적으며 유지하기 더 어렵고 코드는 덜 호환적이다.

10.1.1 이장의 범위

최적화는 주제만으로 몇 권의 책을 채울 수 있는 큰 주제다.


이장은 다양한 최적화 기법들을 논의하는데 대부분은 특정한 플랫폼의 근간이 되는 하드웨어 아키텍처를 깊이 이해하지 않고서도 C++ 코드 속에 쉽게 적용될 수 있다.


이장의 의도는 다른 것에 대해 하나의 프로그래밍 전략을 선택하는 것의 성능비용의 개략적인 추정을 제공하기 위한 것이다(당신은 당신의 컴퓨터상에서 다음 절들에서 논의되는 프로그램들을 가지고 시험해볼 수 있다).


목적은 성능분석, 알고리즘들의 효율성 또는 Big Oh 표기의 이론적 측면들을 탐구하지 않고 그 대신에 구체적인 지침들과 개념들을 제공하는 것에 있다.


10.2 당신의 소프트웨어를 최적화하기 전에

프로그램 최적화의 첫걸음은 병목 현상 검출이다.


그러나 실행 파일의 디버그 버전이 추가적인 코드를 포함하기 때문에 프로그램의 디버그 버전이 아니라 배포 버전(release version)을 분석하는 것이 중요하다. 디버깅 기능이 활성화된 실행 파일은 릴리즈 파일보다 약 40%까지 더 커질 수 있다.


C++ 코드 최적화 Optimization[C++ 속도 최적화] 소스 코드 개선


여러분의 코드는 symbol lookup 및 다른 디버그 “scaffolding"을 위하여 요구된다. 대부분의 구현은 연산자 new 및 다른 라이브러리 함수들의 각기 다른 디버그 및 릴리즈 버전들을 제공한다. 보통 new의 릴리즈 버전은 할당된 메모리를 고윳값으로 초기화하고 블록이 시작되는 부분에 헤더를 추가한다.


new의 릴리즈버전은 이들 작업 중 어떤 것도 수행하지 않는다. 더군다나 실행 파일의 릴리즈 버전은 이미 불필요한 임시 객체들의 제거, loop unrolling, 객체들을 레지스터들로 옮기기 및 인라인화와 같은 몇 가지 방법들로 최적화된다.


이러한 이유로 당신은 성능 병목 현상들이 실제로 위치하는 디버그 버전으로부터 병목현상의 유래를 확실히 찾을 수 없다.


디버깅과 최적화는 서로 다른 동작이다. 디버그 버전은 버그들을 잡고 프로그램이 논리적인 오류들로부터 자유로운지를 검증하기 위하여 사용된다. 테스트 되는 릴리즈 버전은 성능조율 및 최적화 들에서 사용되어야 할 필요가 있다.


물론, 이장에서 제시되는 코드 최적화 기법들을 적용하는 것은 디버그 버전의 성능도 향상할 수 있지만 릴리즈버전은 성능평가를 위하여 사용될 필요가 있는 것이다.



C++ 코드 최적화1 - 소프트웨어 성능 향상

이 글을 공유하기

댓글(0)

Designed by JB FACTORY