Programming

C++ 프로그래밍 단상

대용량 데이터를 처리하는 업무 성격 상, 프로그램 소스코드의 아름다움이나 완결성, 디자인적인 간결성 등의 기준보다는 아무래도 성능을 최우선의 기준으로 삼을 수 밖에 없게 된다.

STL때문에 C++을 사용하게 되는데, 정작 STL을 이용한다 뿐, 코드를 들여다보면 일반적인 C++과는 정말 거리가 멀다.

불필요한 클래스 생성, 소멸의 과부하를 줄이기 위해 어지간한 것은 struct로 만들어서 사용하고(이건 내 개인적인 습관에서 비롯된 프로그래밍 스타일때문이기도 하다.), 자료구조에 가장 많은 빈도로 저장하고 검색하는 데이터는 아무래도 자료 자체를 저장하기보다는 포인터를 대신 저장해서 사용하게 된다. 이렇게 하지 않으면 성능은 포기할 수 밖에 없다.

예를 들어, 100만 개의 데이터 집합에 대해, 문자열을 키로 가지고 정수값을 데이터로 저장하는 프로그램이 있다고 치자. 키가 중복되지 않는다면 연관 배열(associative array)의 형태를 가져야 하므로 hash_map을 쓰는 게 가장 성능이 빠르다. 그런데 문자열을 그대로 저장하게 되면, C++ STL은 로컬 변수로 저장되어 있는 문자열을 copy constructor를 이용하여 새로 하나 생성하여 hash_map에 저장하게 되므로 이 과부하로 인해 성능에서 약간 손해를 보게 된다. 당연히 성능을 위해서라면 저장할 문자열 변수를 new로 동적 할당하고, 그 주소를 담고 있는 포인터만 hash_map에 저장한다.

성능의 차이는 경우마다 다르지만, 적게는 2배에서 5배 이상 나기도 한다. 일반적으로 20% 정도의 성능 향상을 기대할 수만 있어도 포인터를 대신 사용하도록 소스코드를 수정할 텐데, 하물며 2배라면 성능을 최우선 기준으로 삼는 프로그램에서는 당연히 이 방법을 선택해야 할 것이다.

답글 남기기