(전체가 아니라 C#과 차이가 있는 부분을 중심으로 요약 정리)

성능과 효율성에 대하여

프로그램에서 성능(performance)는 속도, 메모리 사용량, 디스크 접근 횟수, 네트워크 사용량 등과 같이 문맥에 따라 가리키는 대상이 다르다. 이 장에서는 주로 속도를 의미한다. 한편 프로그램에서 효율성(efficiency)이란 낭비 없이 실행된다는 것을 의미한다. 효율적인 프로그램은 주어진 상황에서 작업을 최대한 빠르게 처리한다. 물론 프로그램이 다루는 영역에 따라 빠르지 않으면서 효율적으로 만들 수도 있다.

효율성을 확보하기 위한 두 가지 접근 방법

효율성을 높이는 두 가지 방식이 있다. 하나는 언어 차원의 효율성(language-level efficiency) 으로서 언어를 최대한 효율적으로 사용하는 것이다. 예컨대 객체를 값이 아닌 레퍼런스로 전달하는 것이다. 하지만 여기에는 한계가 있다.

또 다른 접근 방식인 디자인 차원의 효율성(design-level efficiency)을 적용하면 성능을 더욱 향상시킬 여지가 훨씬 많다. 예컨대 효율적인 알고리즘을 선정하고, 불필요한 단계나 연산을 제거하고, 적절히 디자인을 최적화하는 것이다. 흔히 비효율적인 알고리즘이나 데이터 구조를 더 나은 것으로 교체하는 방식으로 코드의 성능을 최적화한다.

두 가지 프로그램

애플리케이션이 다루는 영역에 관계 없이 효율성은 중요하다.

(이하 설명 생략)

C++는 비효율적인 언어인가?

C 프로그래머는 고성능 애플리케이션을 개발하는데 C++ 사용을 꺼리는 성향이 있다. C++는 C와 같은 절차형 언어에 비해 비효율적이라는 이유에서다. C++에는 익셉션이나 virtual 메서드와 같은 하이레벨 개념이 담겨 있기 때문이다. 하지만 이런 주장에는 몇 가지 오류가 있다.

언어의 효율성을 따질 때는 반드시 언어 자체의 성능과 컴파일러의 최적화 효율성을 구분해야 한다. 다시 말해 컴파일러의 효율성을 무시하면 안 된다. 개발자가 작성한 C나 C++ 코드와 실제로 컴퓨터에서 실행하는 코드는 엄밀히 말해 다르다.

컴파일러는 개발자가 작성한 소스 코드를 기계어로 변환하는 과정에 최적화 작업을 수행한다. 그래서 C 프로그램과 C++ 프로그램을 단순히 벤치마크 테스트 하는 것만으로는 비교하기 힘들다. 언어를 비교하는 것이 아니라 그 언어의 컴파일러에서 제공하는 쵲ㄱ화 기능을 비교해야 한다.

C++ 컴파일러는 C++에서 제공하는 여러 가지 하이레벨 구문을 최대한 기계어 코드에 가깝게 최적화 한다. 간혹 같은 기능을 C 언어로 작성할 때보다 성능이 뛰어날 때도 있다. 최근에는 C 컴파일러보다 C++ 컴파일러의 최적화에 대한 연구가 훨씬 많다. 그래서 C 코드보다 C++ 코드의 최적화가 더 잘돼서 실행 속도가 빠른 경우가 많다.

하지만 C++의 기능 중 최적화 할 수 없는 부분이 여전히 남아 있다고 반박하는 사람도 있다. 예컨대 10장에서 설명한 virtual 메서드를 구현하려면 vtable이 있어야 할 뿐만 아니라 실행 시간에 호출 단계가 늘어나기 때문에 non-virtual 함수를 호출할 때보다 실행 속도가 떨어질 수 있다.

하지만 좀 더 깊이 생각해 보면 이 주장은 설득력이 떨어진다. virtual 메서드는 단순 함수 호출 이상의 기능을 제공한다. 예컨대 실행 시간에 호출할 함수를 선택하는 기능도 제공한다. 이 기능을 non-virtual이면서 비교 가능한 (comparable) 함수로 구현하면 실제로 호출할 함수를 선택하는 조건문을 추가해야 한다.  선택 기능이 필요 없다면 non-virtual 방식으로 구현하면 된다.

C++는 ‘필요 없는 기능은 굳이 사용할 필요가 없다’는 기본 디자인 원칙을 따른다. virtual 메서드를 사용하지 않으면 이를 사용할 때 발생하는 오버헤드를 피할 수 있따. 따라서 C++에서 non-virtual 함수를 사용하는 부분의 성능은 C에서 함수 호출을 구현한 코드와 같다. 하지만 virtual 함수를 사용함으로써 발생하는 오버헤드가 그리 크지 않기 때문에 final 클래스가 아니라면 모든 메서드(소멸자는 포함, 생성자는 제외)를 virtual로 구현하는 것이 좋다.

이보다 더 중요한 점이 있다. C++에서 제공하는 하이레벨 구문을 활용하면 디자인 측면에서 훨씬 효율적이고, 가독성이 높고, 유지보수하기 좋고, 불필요한 부분이 없는 코드를 만들 수 있다.

C와 같은 절차형 언어를 사용할 때보다 C++ 언어를 사용하면 개발 과정, 성능, 유지보수 측면에서 훨씬 유리하다.

C#이나 자바와 같은 다른 하이레벨 객체지향 언어도 있다. 둘 다 가상 머신에서 구동한다. 반면 C++로 작성한 코드는 CPU에서 곧바로 구동된다. 코드를 실행하는데 가상 머신 같은 중간 단계를 거치지 않는다. 그래서 C++ 프로그램은 거의 하드웨어 수준으로 실행된다. 다시 말해 C#이나 자바보다 훨씬 실행 속도가 빠를 때가 많다.