빠른 코드를 작성하는 시간은 느린 코드를 작성하는 시간보다 결코 길지 않다. 이 책은 올바른 코드를 구현하면서도 빠른 C++ 프로그램을 만드는 최적화 방법을 소개한다. 습관적으로 쓰는 C++ 구문을 점검해보고 싶다면 35년 경력의 저자가 소개하는 10가지 기법으로 시작해보자. 자원을 소비하고 실행 시간을 잡아먹는 부분을 찾아내 개선하다 보면 “와, 정말 빠른데! 누가 고쳤지?!”라는 말을 듣게 될지도 모른다. 실제 사례에 기반한 실용적인 팁으로 진정한 프로가 되어보자.
출판사 리뷰
C++은 자동화와 표현력부터 성능을 향상시키는 세밀한 제어까지, 다양한 옵션을 제공한다. 그래서 C++로 만든 프로그램에는 최적화할 여지가 곳곳에 숨어 있다. ‘코드를 제대로 작성하고 있는 걸까?’ 의심이 든다면 지금 최적화를 시작해보자. 프로그램 속도를 느리게 하는 ‘유력 용의자’를 검거하는 방법은 알고 보면 놀라울 정도로 간단하고 명쾌하다. 저자가 소개하는 풍부한 팁과 예제를 활용해 연습하다 보면 금세 뛰어난 성능을 내면서 가독성까지 높은 코드를 작성할 수 있다.
[이 책에서 다루는 10가지 최적화]
성능에 영향을 주는 컴퓨터 하드웨어 기본 지식
프로파일러와 소프트웨어 타이머를 활용한 측정 기법
최신 C++에서 문자열의 기능을 최적으로 조합하는 방법
비효율적인 알고리즘을 개선하고 C++ 코드의 행동 패턴을 참조해 최적화하는 방법
동적 할당 변수를 제대로 사용하고 메모리 관리자의 호출 횟수를 줄이는 방법
실행에 불필요한 명령어를 제거하여 문장 수준에서 최적화를 이루는 방법
처음부터 고성능을 목표로 하는 라이브러리를 설계하는 방법
C++ 컨테이너 클래스의 장점과 단점을 이해하고 활용하는 방법
C++ 스트리밍 입출력 함수를 효율적으로 사용하는 방법
그 외 성능 저하를 일으키는 요인을 찾아내고 수정하는 방법
저자소개
저자
커트 건서로스
35년 경력 소프트웨어 개발자. 25년 동안 윈도우, 리눅스, 임베디드 장치에서 C++ 코드를 개발했다. 업무 시간 외에는 아내 그리고 네 아들과 함께 지내며, 현재 워싱턴 주 시애틀에 산다.
역자
옥찬호
넥슨 코리아에서 근무하는 게임 프로그래머. C++과 게임 개발, 컴퓨터 그래픽스, 오픈 소스, 강화학습에 관심이 많으며 페이스북 C++ Korea 그룹의 운영자 및 마이크로소프트 MVP로 활동하고 있다. 남는 시간엔 학생들과 다양한 오픈 소스 프로젝트를 진행하며 더 나은 미래를 꿈꾸고 있다. 옮긴 책으로는 『러스트 핵심 노트』(한빛미디어, 2017), 『게임샐러드로 코드 한 줄 없이 게임 만들기』, 『유니티 Shader와 Effect 제작』 , 『2D 게임 프로그래밍』(이상 에이콘출판사), 『모던 C++ 입문』(길벗, 2018)가 있다.
책 자체가 C++ 기반으로 쓰여져 있고, 초중반부부터는 오로지 C++ 최적화를 목적으로만 쓰여진 책입니다만, 다른 언어에도 적용할 수 있는 최적화의 기본 내용을 먼저 다루기 때문에, 다른 언어에서도 놓치고 가는 반복적인 작업이나 실수를 줄일 수 있게끔 해주는 책이 될 수 있을 것이라 생각됩니다.
사소한 부분에서 놓치는 C++ 최적화에 대해 자세히 이야기하고 있다.
아무 맥락 없이 대뜸 이런 부분에서 최적화를 할 수 있으니 이렇게 해야 한다고 말하면서 최적화 방법을 강제하지 않습니다. C++의 표준을 따지고, 실제로 동작이 어떻게 진행되는지 이야기를 하면서, 이런 경우에 대해 어떻게 코드를 작성하는 것이 좋고, 처음 설계 단계부터 어떤 것에 주의를 해야 하는지 이야기를 다룹니다. 문장을 무조건 나열하면서 최적화 방법에 대해서 설명하는 것이 아니라 소제목과 예시 소스코드를 예로 들기 때문에, 술술 읽어나가는 것도 필요한 부분을 찾아 읽는 것도 가능합니다.
믿고 볼 수 있는 오라일리 미디어의 책이다.
흔히들 말하는 조류 책, 어류 책이라고 불리는 것들이 O'REILLY 미디어를 통해 출판된 책입니다. 오라일리 미디어의 책은 일단 검증되었다는 것이 정설입니다. 모든 책이 그 분야에서 1등이라고 이야기할 수는 없지만, 각각의 분야에서 스테디 셀러로 자리매김하고 있다는 점은 부정할 수 없는 사실입니다. 외국에서도 많은 사람들에게 읽혀진 책이고, 이것을 국내로 들여와 번역하는 과정에서 뛰어나신 현업 개발자 및 번역가분들을 거쳐 완성되기 때문에 충분한 검증 과정을 거친 책으로 믿을 수 있는 책이라는 점입니다.
최적화에 대한 책이라고 해서 최적화 방법만 사전식으로 나와있을 줄 알았는데 내용이 생각보다 다양하다.
먼저 최적화의 필요성과 컴퓨터 과학의 기본 지식을 설명해준다. 전반적인 개요 설명이 충분하고, 이후 성능 측정 방법과 최적화 방법에 대해 설명해준다.
앞의 필요성과 개요 부분만 봐도 상당히 중요한 내용이 많다고 생각한다.
성능 측정을 위한 방법도 설명해주고 이런 방법의 다양함과 테스트 방법 및 결과들을 체계적으로 정리하고 문서화하는 것에 대한 중요성, 또 증명해야 하는 목표까지 비단 최적화뿐만 아니라 개발 전반에 있어서 꼭 알아두어야 할 내용이 들어있다.
약간 너무 깊이 들어가는 게 아닌가 싶은 부분은 시간 측정에 필요한 '시간'에 대해 알려주는 부분이다. 어떻게 정확하게 측정할 수 있을까에 대한 내용인데, 진자시계부터 전자시계 등 백과사전에서나 볼법한 예시를 들어줘서 상당히 재미있었다. 또 시스템에서 시간 값을 반환해주는 여러 가지 함수에 대해서도 소개해주었다.
최적화 방법에 대해 알려주는 부분은 이해하는데 어려움이 좀 있었다. c++보다는 c 위주로 작업을 하고 있어서 클래스나 자원 할당에 대한 부분이 익숙하지 않아서 예제를 봐도 와닿지(?) 못하는 부분이 꽤 있어서 아쉬웠다. 기술적으로는 많은 도움이 되었다. c나 다른 언어에도 적용할 수 있는 방법도 많았고, 지금껏 생각하지 못한 새로운 아이디어처럼 느껴지는 방법도 있었다. 입문자보다는 어느 정도 실전 경험이 있는 사람이라면 정말 큰 도움이 될 책이라고 생각한다. 예제 코드만 봐도 몇 줄 수정하지 않고 20%씩 성능이 오르는 걸 보면 담당하는 제품에도 이런 식으로 적용하면 마법같이 빨라지겠다 싶은 생각과 함께 코딩 욕구가 솟아오르기도 한다. 개발 참고서라 그렇게 중요하지는 않은 부분이지만 직역하는 느낌에 읽다가 흐름이 끊기는 부분이 몇 번 있었던 것 같다.
지금까지 수많은 프로그래밍 언어가 개발되고 사용되었지만 C/C++ 처럼 그 역사가 오래되었음에도 현재까지 꾸준히 사용되고 있는 언어는 드물다. 많은 기능과 쉬운 사용법을 주장하는 최신 프로그래밍 언어들 사이에서도 C/C++이 여전한 인기를 유지하는 비결은 무엇일까? 그것은 바로 C/C++로 개발된 프로그램의 성능 아닐까 생각한다.
최근에는 하드웨어의 눈부신 발전으로 최적화의 중요도가 많이 줄어든 것은 사실이다. 하지만 최적화를 통해 성능이 낮은 하드웨에서도 문제없이 프로그램을 돌아가게 하거나, 서버 프로그램의 최적화를 통해 동시 유저 수를 늘릴 수 있다면 이는 곧 비용 절약을 통한 이익의 극대화를 추구할 수 있으므로 이러한 관점에서 볼 때 최적화는 여전히 중요하다고 생각된다.
이 책에서는 저자의 풍부한 개발 경험을 바탕으로 최적화 시 알아야 할 기초 상식과 방법들을 13장에 걸쳐 설명하고 있다. 각각의 최적화 방법에 대한 자세한 설명과 함께 간결한 예제 코드가 포함되어 있기 때문에 이해하는데 크게 어렵지는 않았다. 하지만 이 책을 읽다보면 C++의 최신 표준 및 STL, 시간 복잡성, 동시성 등의 개념이 나오는데 해당 지식에 익숙치 않은 독자들은 "C++ 최적화"를 읽기 전에 해당 부분들을 선행 학습하길 권하고 싶다.
이 책은 비록 C++을 이용한 최적화를 설명한 책이지만 이 책에 나와 있는 기본적인 개념 및 원리들은 다른 언어로 개발을 할 때에도 적용할 수 있겠다는 생각이 들었다. 그리고 단순히 프로그래밍 언어의 문법을 익히고 원하는 동작을 개발하는 수준을 넘어서서 내가 작성한 코드나 사용한 라이브러리가 내부적으로 어떤 식으로 동작하는지를 이해한다면 한 단계 높은 수준의 프로그래머로 발전할 수 있지 않을까 생각하면서 이 글을 마친다.
C++은 복잡해서 좋아하지 않는 언어지만, 최적화라는 영역은 프로그래밍 언어에 관계없이 적용되는 영역이 있어서 배울 점이 많을 거라 생각했고, 역자가 나름 유명한 개발자라 읽게 되었다.
책의 박스 부분에 나오는 저자의 경험을 보면 저자가 하드웨어 관련 경력이 있음을 알 수 있고 그 때문에 최적화에 더 관심을 갖게 되었을 거란 추측을 할 수 있다. 하드웨어 관련 업종은 일반적으로 제조업이기 때문에 비용을 절감하는 제품을 만들기 위해 성능 최적화가 매우 중요하기 때문이다.
1장
책 전체의 개괄로 최적화가 왜 필요한지, 기본적인 최적화 방법이 무엇인지, 각 장마다 뭘 설명할지 이야기한다.
2장
하드웨어와 관련된 부분이라 프로그래밍은 나오지 않지만 최적화를 하기 위해 꼭 알아둬야 할 부분이다. 1장에 나와있고 일반적으로도 알려졌듯이 하드웨어 최적화가 가능한 경우라면 소프트웨어 최적화에 비해 간단한 코드로 큰 폭의 성능향상이 가능하다(하지만, 사실 이정도의 성능향상을 얻는다면 이전 코드가 매우 성능이 안 좋았다는 반증일 수도 있다). 2장에서 말하는 하드웨어와 관련된 부분은 미세할 수도 있지만 때에 따라서는 굉장히 유용할 수 있는 지식인데 모르는 경우 누가 알려주지 않는 한 정말 알기가 어려우므로 이런게 있다는 걸 기억해두고 필요할 때 다시 보는 정도로 충분할 거 같다.
3장
1장에서 인용했던 크누스 교수의 말을 다시 인용하며 3장을 소개한다. ‘섣부른' 최적화가 만악의 근원이라고 했지, 최적화가 만악의 근원이라고 하지는 않았다. 즉 크누스 교수는 체계적으로 분석한 후 최적화를 통해 얻을 수 있는 성능 향상의 폭이 크다면 그 부분을 집중해서 봐야 한다고 말했던 거라고 저자는 말한다(이 부분을 90/10의 법칙으로 요약한 후 암달의 법칙을 소개). 이어서 당연하게도 프로파일러를 통해 시간을 측정을 하는 이야기와, 어떻게 성능과 관련된 시간을 추론하고 정확히 측정할 것인지 여러가지 방법을 설명한다.
4장
어떤 언어를 쓰건 상관없이 아마 대부분의 개발자가 가장 많이 다뤄야 하는 문자열에 대해 이야기한다. 버퍼의 동적 할당이나, C의 malloc을 이용한 메모리 할당의 빠른 속도, 일반 loop 대신 iterator를 사용하는 경우의 성능향상등이야 다른 언어에서도 통하는 상식과도 같은 부분이지만, a = a + 'some string' 과 a += 'some string' 이 C++에서는 서로 다른 연산자로 동작한다는 사실은 처음 알았다(임시 문자열 객체 생성 유무의 차이).
5장
알고리즘 최적화에 관해 설명하는데 소팅을 예로 이야기한다. 일반적으로 인터뷰에서 흔히 퀵소트를 가장 빠른 소팅 알고리즘으로 이야기하곤 하고, 이 부분은 대부분의 지원자들이 잘 대답하지만, 최악의 경우에는 어떤지, 특수한 경우에 더 나은 알고리즘이 없는지로 옮겨가면 많은 지원자들이 대답을 못하곤 한다. 저자도 이런 많이 알려진 이야기부터 시작해 더 고도화된 최적화를 위해 사용할 수 있는 여러가지 알고리즘 기법들 — 캐싱, 힌팅, 경로 최적화 등 — 이 어떤 경우에 사용할 수 있는지를 알려준다.
6장
프로그래밍을 하면서 가장 중요한 부분 중 하나인 메모리 할당을 설명한다. C++ 문법에 관계된 부분들이 좀 있어 모두 이해할 수는 없었지만, 기본적인 부분은 다른 언어에서와 동일했다. 예를 들어 참조가 많은 부분에 일어나는 경우나 loop 외부가 아니라 내부에서 변수를 선언하면 성능이 하락되는 경우가 거기에 해당한다. C의 malloc을 쓰다가 C+의 new만 사용해도 편리함을 느끼는데, 스마트 포인터를 쓰면 아마 훨씬 더 쉽게 프로그래밍을 할 수 있을 거 같지만, 편리함과 성능은 일반적으로 반비례할 가능성이 높다는 걸 생각하고 주의를 기울여야 함을 알 수 있었다.
7장
이 장을 시작하면서 저자가 스스로 말하지만, 문장의 최적화는 큰 이득을 얻기가 힘들다. 명령어를 적게 사용하기 때문에 최적화의 이득도 작고, 컴파일러가 최적화하기 어렵거나, 컴파일러에 따라 결과가 다를 수 있기 때문이다. 그렇지만 여전히 문장 최적화를 무시할 수는 없는데, 특히 표현식은 함부로 변경하면 비지니스 로직의 문제가 발생할 수 있어서 컴파일러가 쉽게 최적화할 수 없기 때문이다. 그 외 가상함수, 인터페이스나 DLL 부분등은 C++나 window specific한 부분이라 자세히 읽지 않았다. 하지만 부동소수점 대신 정수를 사용해야 하는 부분은 어느 언어를 사용하느냐에 관계없이 꼭 기억해야 할 부분이다.
8장
라이브러리 최적화에 대해 설명하는데, 이 장은 최적화뿐만 아니라 설계를 할 때도 유용한 방법을 이야기한다. 일반적으로 개발을 할 때 처음부터 모든 걸 새로 설계하는 일보다는 다른 라이브러리나 API를 이용해 개발을 할 때가 많은데, 이 때 기존의 라이브러리/API를 변경하는 일은 위험성이 크다. 해당 코드를 이용해서 동작하고 있는 다른 개발자/부서의 프로그램/API가 망가질 수 있기 때문인데, 그래서 원하는 기능을 추가하거나 상속을 통해 개발을 하는 게 안전하다(물론 이런 경우에도 clean architecture를 위해 필요한 일들이 있지만 이건 최적화와는 별개 이야기이므로 여기서 더 언급하진 않는다).
9장
std::map의 find() 함수를 시작으로, 각종 C++ library를 이용할 때 어떻게 최적화를 하는지를 자세히 설명한다. 코드 예가 C++이라는 점만 제외하면 프로그래밍 언어와 무관하게 적용할 수 있는 방법이라 누구에게나 도움이 된다.
10장
STL을 이용해 라이브러리를 제대로 이용하는 방법을 이야기한다. Big O notation의 관점에서는 같은 complexity를 갖는 자료구조라고 해도, 실제로 테스트를 해보면 내부 구현의 차이 때문에 속도 차이가 나는 경우가 있다거나, 테스트를 진행할 때 내부 구현의 특성을 감안하지 않으면 실제 성능을 낼 수 없어서 테스트가 왜곡될 수 있다는 점을 알려준다. 마지막에는 boost나 EASTL과 같은 더 다양하거나 개선된 자료구조를 갖는 라이브러리를 알려준다. 좀 더 C++에 특화되긴 했지만 9장과 마찬가지로 프로그래밍 언어에 무관하게 배울 점이 있다.
11장
어떤 작업을 하건 거의 피할 수 없는 file I/O와 관련된 최적화를 자세히 보여준다. 간단한 file read 함수를 만들고, 경우에 따라 어떻게 다른지 실험 결과를 밀리초로 알려주는데, 대부분 stl 내부의 함수를 사용하지만 경우에 따라 5배까지 차이가 나기 때문에 잘 알고 사용하는 게 얼마나 중요한지 실감할 수 있다. 상대적으로 write 함수는 간단하게 마치는데, 최초 함수 자체가 한 줄로 끝나서 별로 바꿀 게 없어 보이는데도 수정 후 큰 차이를 나타낸다(std::endl의 사용 유무에 따른 flush 유무로 인해 발생).
12장
아마 다른 어떤 내용보다 이해하기 힘들 거 같은데 동시성에 대한 이야기는 따로 하나의 책으로 써도 엄청나게 두꺼워질 만큼 다양하고 복잡한 내용을 포함하는 주제이기 때문이다. 저자는 일반적인 동시성에 대한 주제와 C++에 특화된 부분을 같이 섞어 자세히 설명하고 있으며, 그 안에서 피해야 할 부분이나 일반적으로 적용할 수 있는 최적화를 보여주지만 다른 장들에 비해 최적화 자체에 대한 이야기는 적다. C++에서도 Java의 Java Concurrency in Practice에 해당하는 책이 있을지 모르겠는데, 이런 동시성에 특화된 책을 따로 봐야할 거라고 생각한다.
13장
마지막으로 메모리 관리를 설명한다. C++이므로 new, delete 연산자에 대한 자세한 내부 동작을 이야기하고, 고성능을 제공하는 malloc을 대체하는 라이브러리를 알려준다(하지만 경우에 따라 성능 향상은 거의 없을 수도 있고 수십%에 이를 수도 있음). 이어서 operator new를 overload해 메모리 관리를 하는 operator를 사용자가 재정의할 수 있는 방법과 어떤 식으로 최적화할 수 있는지를 다양한 코드를 통해 설명한다.
C++은 매우 기초적인 부분밖에 몰라 코드를 자세하기 볼 일은 없었지만, 언어에 관계없이 적용할 수 있는 최적화의 원칙이나 방법에 대해서도 상세하게 나와있기 때문에 개발자들에게 큰 도움을 주는 책이다.
예제
mac에서 g++을 이용해 test했는데, 대부분 option 없이 g++로 compile하거나 — std=c++14만 사용하면 compile에 별 문제가 없었다.
❯ g++ --version Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/c++/4.2.1 Apple LLVM version 10.0.1 (clang-1001.0.46.4) Target: x86_64-apple-darwin18.7.0 Thread model: posix InstalledDir: /Library/Developer/CommandLineTools/usr/bin
개인적으로 최근 C++은 현대적인 기능들을 쉽고 명시적으로 제공하는가에 많은 초점을 맞추고 있다고 생각한다. 새롭게 개정되고 있는 C++ 표준들은 C++11, 14, 17을 거쳐 최근에는 20에 대한 이야기가 이루어지고 있다. 숫자의 간격을 봐서 알겠지만 3년 단위로 새로운 표준들이 제시된다. 이러한 표준들은 다양한 자료구조, 알고리즘과 람다와 같은 기능들을 제공할 뿐 아니라 안정성, 성능까지 얻어갈 수 있게 하는 노력들이 이루어지고 있다.
C++은 1980년대 만들어져 지금까지 다방면으로 사용되고 있는 훌륭한 개발 언어이긴 하지만 솔직히 그 동안 C++은 개발자들에게 다루기 어려운 언어인 것 또한 사실이다. 새로운 표준의 C++에 대해서 관심을 갖고 모니터링하는 것은 매우 중요하게 되었다. 하지만 빠르게 이해하기 위해서 C++에 대해서 잘 알고 있는 사람에게 직접적인 조언을 받고 싶은 적이 꽤 많았다. 그러면에서 Optimized C++책은 성능 및 코드 최적화를 하고 싶은 사람에게 그리고 내부 동작에 대한 이해를 원하는 사람에게 단비 같은 책이라고 할 수 있다.
저자인 커트 건서로스가 책 소개 부분에서 이야기했듯이 최적화에 대한 내용은 알아야할 기술들이 너무나도 많다. 그렇기에 10가지 최적화 내용들을 읽어가며 한줄 한줄 컴퓨터 과학에 대한 기본 이론 정보들을 밀집하고 있다는 느낌을 지울 수 없었다. 컴퓨터의 동작 방식과 각종 로우 레벨 용어들이 집약되어 있는 한 문단을 이해하려면 위키 또는 구글의 수 많은 블로그들을 통해서 도움을 받아야 할 수 있다. 물론 그럼에도 불구하고 한번쯤은 읽어보고 최적화 코드에 대해서 생각을 정리해보면 좋을 책이다.
각 챕터는 첫 소개 설명부터 시작하여 최적화 방법에 대한 설명 그리고 중간중간 최적화에 대한 가벼운 사례 및 예제 코드 그리고 마지막 마무리로 구성되어 있다.
가장 재미있게 읽었던 챕터는 4장 문자열 최적화와 7장 문장 최적화이다. 사실 개발을 할 때 문자열은 공기처럼 알게 모르게 너무나도 많이 사용되는 것도 있고 예제 코드에 대해서 하나씩 최적화를 하게 되는데 장단점 그리고 성능을 정리하는 글 작성방식이 꽤 맘에 들었고 재미있었기 때문이다. 4장 7장의 내용들은 C++ 뿐 아니라 다른 언어에서도 최적화하는데 활용할 수 있다. 그 외 5장 알고리즘 최적화, 6장 동적 할당 변수 최적화, 9장 검색 및 정렬 최적화, 10장 자료구조 최적화등은 기존에 알고 있던 내용을 정리하는데 큰 도움이 되었다. 각 챕터별 의존성이 없기 때문에 필요한 챕터 또는 관심있는 챕터부터 읽어나가면 된다.
이 책은 C++ 중급자에게 추천하지만 챕터별로 난이도가 상이하여 초급자 또한 읽어도 좋을꺼 같다.
정말 강력하게 추천하는 책이다. 책의 내용 구성부터 너무나도 알차다. 초반에는 기본적으로 최적화 할 수 있는 방향을 제시함으로써 C++ 을 최적화를 해야하는 이유를 자세히 설명을 해준다. 사실 모든 언어에서도 최적화는 필요로 하지만 방대한 자료와 자율성을 가진 C++ 로써는 최적화의 기법도 상당히 많고, 기괴하다. 개인적으로 C++ 기초 공부하고 Effective C++ 책을 보며 실력을 향상시키는 정석(?) 적인 방향으로 잡았었다면 개인적으론 STL 기본 공부까지 마치고 난뒤 이책을 꼭 보라고 추천하고 싶다. 기본적인 STL을 무작정 사용하지 않고 어떻게 사용하면 효과적으로 성능을 낼 수 있을지 자세히 설명이 되어있다. 또한 STL을 사용하며 주의점도 알려줌으로써 기본적인 STL 사용법을 강화 시켜 줄 수 있을것 같다. 또한 입출력 최적화, 스레드 최적화 메모리 최적화도 설명 함으로써 아주 심화 깊은 얘기를 다룰수는 없는 분량이지만 자신이 조금더 깊은 공부를 하고 싶다면 이책을 꼭 한번 읽고 공부를 하면 좋을 것같다는 생각이 든다. 책의 난이도는 약간 있으니 초심자가 보기는 부담 스러울 수는 있으나, 방대한 양을 설명을 하기보단 기본적이고 핵심적인 최적화를 설명하기에 꼭 읽어보길 추천하며 기본 문법과 간단한 STL 공부는 하고 책을 읽으면 훨씬 많이 도움이 될 책이다.
이번 파이콘(2019)에서 파이썬 3.7 어찌 그렇게 빨라졌나세션을 들었다. 해당 세션을 들으면서 CPython에 대한 호기심이 생겼고, 덕분에 C/C++을 좀 더 공부해야겠다고 생각했다. 약 10년 가까이 Java와 Python으로 대부분의 업무를 처리했는데, 아주 어린시절 정말 즐겁게 가지고 놀던 언어인 C/C++에 대한 아련함이 떠올랐지만 너무 오랜 시간 해당 언어를 사용하지 않아서 코드 작성, 개발 환경, 그리고 용례나 관례에 대한 감이 전혀 없는 상태였다.
2
C++ 문법은 예전에 배워서 대충 알고 있다고 생각해서, 문법도 복습하고 요즘 나오는 C++ 용례나 관례를 알아보고 싶었는데, 책에서 C++11, C++14, 그리고 C++17 이런거 보면서 약간 동공지진(!)이 왔다.
대부분의 내용은 일반적인 C++(책을 찬찬히 읽어본 결과 C++11이전?)에 대한 내용은 기본적으로 알아야 읽을 수 있다. 제목에서 «최적화»라고 해서 약간 어렵겠진 생각했는데 C++에 대한 문법 이해와 일반적인 코드 작성 능력만 있으면 읽는데는 크게 무리없을 것으로 생각된다. 앞부분에 개략적인 내용이 나오니 그 부분부터 잘 읽어두면 좋을 듯 싶다. 그리고 «검색 및 정렬 최적화»와 «자료구조 최적화» 부분등과 같이 여러 언어에서 사용하는 기법의 경우 C++ 뿐만 아니라 Java나 Python 등에서 고려해볼만한 내용이 많았다.
3
C++11 이후로 문법에 몇가지 변화가 있었고, 문법뿐만 아니라 개념적으로 변화가 있었던 것으로 보인다. 해당 책에선 C++11 이후의 문법뿐만 아니라 C++11 이전의 경험을 가진 개발자를 위해서 두 가지 설명을 병행해서 하기 때문에 C++ 문법을 아는 개발자라면 코드 리딩 및 작성에서 좋은 지침이 될 것이다.
번역자분의 C++에 대한 탁월한 식견, 그리고 좋은 번역 덕분에 약간 어렵지만 많은 도움이 되는 책을 읽었다. 덕분에 CPython을 분석하는데 여러가지 도움이 되었다.
최적화의 개념을 처음 접했던 것은 대학 시절 "소프트웨어 공학" 강의 시간이었습니다. 이론 중심적인 강의였기 때문에 최적화를 실무 환경에서 고객의 요구를 충족하고 비용을 줄이기 위해 소프트웨어 개발 프로세스의 후반부에 수행하는 과정 중의 하나라고 인식하는 정도에 그쳤던 것 같습니다. 프로그래밍 과제나 학기 단위 프로젝트에 최적화 기법을 적용하는 것은 전적으로 개인의 역량이었고 교수님의 평가 기준에 속한 것도 아니었습니다. 저는 게으른 학생인 편이었기 때문에 반복문 내부에서 같은 함수의 호출이 반복적으로 일어나는 것 정도를 수정하는 "발적화" 수준에 머물렀고 전후 성능을 측정하여 비교하는 섬세함을 발휘하지도 않았습니다.
그다지 중요하게 여기지 않던 최적화의 필요성을 느낀 것은 "임베디드 프로그래밍" 강의를 수강하며 라인 트레이서를 구현하는 프로젝트를 진행할 때였습니다. 집이나 실습실의 PC에 비하면 아주 협소한 하드웨어에 모든 요구 사항을 구겨 넣기 위해서는 코드 최적화가 필수였습니다. 소스 파일의 용량을 조금이라도 줄이고 메모리를 효율적으로 사용하기 위해 밤을 새우며 고민하던 체력과 열정은 지금 어디로 간 것일까요?
임베디드 C++ 개발자의 경험을 "노련하게 풀어낸 책"
이 책의 저자는 임베디드 C++ 개발자 경력을 가지고 있습니다. 성능 향상을 위한 입증된 테크닉을 소개하며 실제 경험을 기반으로 소프트웨어 성능과 관련된 문제들을 언급합니다. 챕터의 소제목을 포함하여 기술 지식을 맛있게 포장해 놓은 흔적을 많이 발견할 수 있습니다. 적게는 수 배에서 많게는 수백 배의 성능 개선이 이루어지는 최적화 기법을 흑마술에 비유한 것은 적절한 표현이라고 생각합니다. 이 책은 최적화라는 무거운 컨셉과는 달리 생각보다 쉽고 즐겁게 읽을 수 있습니다. 뒤집어 생각하면 이 책은 접근하기 쉬운 방식으로 최적화를 간단하게 소개하는 수준에 그칩니다. 나쁜 책이라고 할 수는 없지만 제시된 예제와 최적화 기법은 딱히 새로운 것이 없고 단순합니다. 특히 자료구조 최적화를 다룬 10장은 C++ 기본서에서 볼 수 있는 지식을 나열해 놓은 것에 불과합니다. 이를 저자로서의 노련함이라고 포장해야 할까요?
"가볍게" 읽을 수 있는 최적화 입문서
개인적으로 최적화는 OOP와 STL을 학습한 후 디자인 패턴을 다루기 전에 학습하기 좋은 주제라고 생각합니다. 다만 이 책을 전적으로 의지하여 최적화를 학습하기에는 부족한 요소가 많습니다. 이 책의 절반가량은 C++의 기능을 설명하며 나머지 부분도 C++을 깊게 이해하고 있는 분이라면 이미 알 법한 내용입니다. 즉, C++ 프로젝트 경험이 많고 STL을 잘 이해하고 있는 분에게는 새로운 것이 없는 내용으로 구성된 책입니다. 최적화와 전혀 관련 없는 내용을 다루는 것은 아니지만 정확성이 떨어지고 뭔가 많이 빠진 느낌입니다. 바이블 수준의 기본서를 학습한 후 STL의 동작을 추가로 학습하고 싶고 최적화에 간단히 입문하고 싶은 분이라면 추천할만한 책입니다. 하지만 현실적으로 C++ 기본서를 마스터했더라도 최적화라는 주제에 관심을 두기에는 이른 단계이지 않을까요? 어쨌든 왜 최적화를 해야 하며 최적화의 핵심이 무엇인가에 대한 정답만큼은 확실하게 제시하는 책입니다.
최근에는 주로 C#과 JAVA 프로그램 언어를 쓰고 있으나, 게임 개발 또는 성능 개선이 필요한 곳에는 C++을 쓰곤 한다. 과거 어셈블리나 C를 썼던 것과 같이 요즘은 C++이 대신하는 언어가 되어 버렸다. 유니티가 C#을 지원하고 있으나, 게임 관련 각종 엔진은 C++로 제작된 경우가 많다는 것도 다들 잘 알고 있는 사실일 것이다. 실제 주변을 봐도
내가 아는 개발자 친구도 빠른 처리가 필요한 증권사 프로그램에 필요한 각종 라이브러리는 C++로 제작하고 있다.
그만큼 C++은 어떤 프레임워크에 기초가 되는 하부 구성으로 효율성과 속도가 무척 중요한 부분에 많이 사용되는데, 최적화는 이런 프로그램 개발에 있어 모든 곳에서 다뤄져야 할 아주 중요한 사항이다.
그런데, 최적화는 단순히 몇 가지 기술만 안다고 되는 문제가 아니다. 최적화는 프로그램 전반에서 이뤄져야 하는 만큼, 다양한 측면을 바라보고, 코딩 라인마다 습관처럼 적용해야 한다. 그러다 보니 최적화 기술을 익히는 것은 쉽지가 않다. 또한 최적화는 코드 테스트와 같이 많은 시행착오를 거친 경험적 측면을 필요로 하는데, 업무 속도나 개발 일정만 따지는 환경에서 최적화 노하우를 축적한다는 것은 거의 불가능하다. 게다가 최적화를 다룬 책 또한 많지가 않다는 점에서 여러 가지로 난관이 많은 것이 프로그래밍의 최적화인 것이다.
그래도 다행인 것은 'C++ 최적화'와 같은 책이 있다는 것이다. 많지 않은 최적화 책 중에서 좀 더 다양한 것들을 익힐 수 있는 좋은 책으로 최적화의 의미부터 시작해서, 하드웨어에서의 최적화, 성능 측정, 문자열, 알고리즘, 동적 할당 변수, 문장 최적화, 라이브러리, 검색 및 정렬, 자료구조, 입출력, 동시성, 메모리 관리와 같이 개발 전반에 필요한 파트별 최적화 내용을 다루고 있다.
이 책은 C++11을 기준으로 설명하고 있으나, 지금의 C++17 릴리즈에도 적용되는 내용들이다.
책 초반을 보면, 최적화에 대한 여러 고민을 얘기하고 있다. 최적화 무의미론도 살펴보고 있다. 책에 나온 거와같이 노력 대비 최적화로 얻을 수 있는 이득이 그리 크지 않다는 주장도 많은데, 항상 일정이 부족한 개발 현장에서는 일리가 있는 소리다. 어차피 개발 현장에서는 애자일 방법론이고, 패턴이고, 뭐고, 일정이 최고의 과제이기 때문이다. 그러나 일정에 맞춰 돌기만 하면 된다는 현장에서도 일이 어느 정도 마무리가 되면, 개발자 입장에서는 미치고 환장하게도 효율 개선과 속도 향상을 요구하곤 한다. 어쨌든 이런 요구에 현명하게 대응하기 위해서라도 최소 최적화에 대해 기본적인 지식은 알고 있어야 한다 생각한다.
프로그래밍을 하다 보면, 어떤 기능을 구현하는데, 방법이 여러 가지가 있는 경우를 많이 접하게 된다. 어떤 것을 사용하는 것이 옳은 방법인지 한참 고민에 빠지기도 한다. 책에는 그러한 경우에 대한 명확한 답을 제시한다. 필자가 실제 테스트해보고, 어떤 것이 효율적인지, 어떤 것이 더 빠르게 연산하는지, 확실한 답을 해주는 것이다.
예를 들어, std::thread와 std::async 경우도 그러하다. 프로그램에서 둘 다 동일한 기능을 구현할 수 있다. 그런데 저자는 std::async를 쓰라고 한다. 스레드는 직간접 비용이 많이 든다는 것이다. 메모리 양의 증가와 지연 또는 스래싱 등의 문제를 유발할 수 있다고 한다. std::vector와 std::array도 비슷하다. 꼭 필요하지 않는 한, 동일하게 구현이 가능하다면, std::array를 사용하라고 한다.
이렇게 'C++ 최적화'에서는 써야 할 것과 쓰지 말아야 할 것, 확인이 필요한 것 또는 염두에 둬야 할 사항들을 잘 정리해서 알려 주고 있다. 그렇기에 이 책은 개발자가 많은 시행착오를 겪어 가며, 동일한 문제로 쓸데없이 시간 낭비를 하지 않게 해준다. 바쁜 개발 일정 속에서도 최적화된 코드를 작성할 수 있게 돕는 것이다. 그리고 최소 여러 이유로 당장은 최적화된 코드를 작성하지 못하더라도, 나중에 어디를 고쳐야 할지 방향을 알 수 있게 해준다.
'C++ 최적화'가 여러모로 개발자의 스킬과 시각을 넓히는데 도움을 주는데, 다만 책 주제 자체가 프로그래밍의 깊은 곳을 건드리고 있는 만큼, 결코 쉬운 수준의 책이 아니라는 점이 아쉽다. 2장만 해도 컴퓨터 하드웨어 메커니즘에 대한 이해가 어느 정도 되어 있어야 이해가 빠르며, 이와 함께 C++ 문법을 전체적으로 잘 파악하고 있거나, 실제 여러 코딩 경험이 있는 개발자에게 어울리는 수준의 책이다. 그러나 이해하고 못하고는 개인마다 다른 것이고, 책 설명이 아주 난해한 정도는 아니므로, 자신이 이해 가능한 부분부터 보는 것도 나쁘지 않을 것이다.
책을 보는 내내, 부분별로 내가 짰던 코드를 떠올려 봤다. 어디를 개선해야 할지, 다시 생각했다. 이렇게 하다 보면, 최적화된 코딩 습관도 저절로 몸에 붙을 것이다. 레벨업을 위해 앞으로도 계속 'C++ 최적화'를 참고할 생각이다.
자신의 프로그래밍 능력을 한 단계 업그레이드하고 싶은 분이라면, 'C++ 최적화'가 큰 도움이 되어 줄 것이라 생각한다.
C++은 자동화와 표현력부터 성능 향상을 위한 세밀한 제어까지 다양한 기능 구현 옵션을 제공합니다. 바로 이러한 폭넓은 선택 가능성 덕분에 성능 요구 사항을 충족하기 위해 C++ 프로그램을 향상할 수 있습니다.
C++에는 함수 호출, 메모리 할당, 루프등 최저고하 대상이 되는 ‘유력 용의자’들이 있습니다. 최적화 조언은 쉽고 간단하게 설명합니다. 대부분 기존에 어딘가에서 발표된 내용들입니다.
이 책은 개발자가 최적화 기회를 알아보고 최대한 잘 활용하여 코드 성능을 향상하는데 도움이 될 것입니다.
다음은 최적화에 대해서 배울 내용들을 요약한것입니다.
더 좋은 컴파일러를 사용하고 최적화 설정을 사용하세요.
최적의 알고리즘을 사용하세요.
더 좋은 라이브러리를 더 잘 사용하세요.
메모리 할당을 줄이세요.
복사를 줄이세요.
계산을 제거하세요.
최적의 자료구조를 사용하세요.
동시성을 증가시키세요.
메모리 관리를 최적화하세요.
이 책을 읽고 예제를 이해하기 위해서는 C++의 어느 정도 문법적 지식과 동작원리를 잘 알고 있어야 한다. 그리고 모던 C++ 11과 같은 문법도 이용하여 설명 하고 있어 최신 문법도 알고 있으면 이해하는데 도움이 된다. 이책은 C++의 입문서가 아니라 초급에서 중급으로 넘어가는 책이다. C++ 실무에서 3-5년차 정도가 보면 많은 도움이 될것이라 생각합니다. 그리고 리팩토링과 클린 코드를 지향하는 사람이라면 좋은 지침서로서 추천 합니다.
올해 7월에 출간된 Optimized C++ (C++ 최적화) 책에서는 C++ 이라는 언어를 생각해보면 "필요한 기능은 모두 구현해놓을테니 여러분이 만들고 싶은 코드를 원하는대로 만들어 보세요" 라는 느낌이 든다고 필자는 말하고 있었다. 사실 시중에 C++ 언어를 배우기에 좋은 책만 나와있지, 최적화 라는 분야를 다루는 책은 거의 없다.
그런데 이번에 고맙게도 한빛미디어에서 Optimized C++ 책을 출시해주었다. 앞으로도 희소하면서도 메리트 있는 분야를 다루는 책이 많이 출간되었으면 좋겠다. 또한 이 책을 학부 4학년 때 배울 수 있었더라면 어땠을까 하는 생각도 드는데, 그런 생각 보다는 이미 시간은 지나갔으니 지금 당장 공부하는 것이 낫다는 생각도 든다. 모든 개발자에게 있어 C++을 다루는 사람이라면 짭짤한 책이다.
책의 구성은 다음과 같다.
최적화란
컴퓨터 하드웨어와 최적화
성능 측정
문자열 최적화
알고리즘 최적화
동적 할당 변수 최적화
문장 최적화
라이브러리 최적화
검색 및 정렬 최적화
자료구조 최적화
입출력 최적화
동시성 최적화
메모리 관리 최적화
사실 최적화 라는 분야는 소프트웨어나 하드웨어를 개발하는데 있어 필수적인 요소이다. 아직 자료구조를 익히지 못했거나, 간단한 print 문 조차도 어떻게 돌아가는지 이해하지 못했다면 최적화 라는 분야가 필요없게 느껴질 수도 있다. 하지만 최적화 라는 분야는 전통적인 소프트웨어 개발 프로세스에서 코드를 완성하고서 프로젝트 통합 및 테스트 단계에서 수행되는데, 여기서 올바르게 프로그램을 개선하여 "속도", "메모리 사용량", "전력 소비" 등에 대한 이슈들을 해결해야한다.
또한 최적화라는 것이 프로그램에서 가장 느린 곳을 개선하면 끝나는게 아니라, 그 다음으로 느린 곳이 다시 가장 느린 곳이 되어 성능을 좌우하게 되는 반복 과정이기 때문에 "실험 과학" 측면에서 개발자의 올바른 경험과 직관을 가지고 프로그램을 수정해나가야 한다고 책에서는 말하고 있었다.
책 목차에서 가장 관심 있는 분야는 메모리 관리 최적화이다. C++ 메모리 관리 API를 사용하여 메모리 관리를 할 수 있는데, 여기서 동적 변수의 생명 주기는 할당, 배치, 사용, 파괴, 해제의 5단계로 나뉜다고 한다.
할당
프로그램은 연속적인 메모리 영역을 가리키는 포인터를 반환하도록 요청하는데, 포인터는 적어도 지정된 수 만큼의 타입이 없는 메모리 바이트를 포함하고 있어야 하며, 메모리를 사용할 수 없는 경우 할당을 실패한다. C 라이브러리 함수 malloc() 과 C++ 함수 operator new() 의 다양한 오버로드가 할당 단계를 관리 할 수 있다 .
배치
프로그램은 할당된 메모리에 값을 저장해 동적 변수의 초깃값을 설정한다. 만약 변수가 클래스 인스턴스라면 클래스 생성자 중 하나가 호출된다. 예외 값이 들어올 경우, 메모리 관리자에게 할당된 저장공간을 반환해야하기 때문에 배치를 실패 할 수도 있다. new 표현식이 이와 같다.
사용
프로그램은 동적 변수의 값을 읽고 동적 변수의 멤버 함수를 호출하며 동적 변수에 값을 쓴다. 간단히 말해서, 동적 변수를 이곳 저곳에 사용하는 것이다.
파괴
변수가 클래스 인스턴스라면 프로그램은 클래스의 소멸자를 호출해 동적 변수에 대한 최종 작동을 수행한다. 동적 변수가 갖는 시스템 "자원"을 반환하고 정리한다. 소멸자가 본문에서 처리되지 않은 예외를 던질 경우 파괴되지 않을 수 있다. 이 때 프로그램이 무조건 종료되며 delete 라는 표현이 이 단계를 관리하게 된다.
해제
프로그램은 이전에 파괴된 동적 변수에 속하는 저장 공간을 메모리 관리자에게 반환한다. 라이브러리 함수 free() 와 C++ 함수 operator delete() 의 다양한 오버로드가 해제 단계를 수행 할 수 있다.
양한 방면에서 아주 소중한 우리 C++을 더욱더 잘 쓸 수 있도록 가이드해주는 C++ 최적화 책이 출간되었다! 한빛미디어에서 리뷰어로 읽을 수 있게 해주어서 너무나도 기쁘다.
C++을 더욱더 잘 쓰려면 컴퓨터 구조와 시스템동하는 방식에 대해서 잘 알아야 하며, 컴파일러가 어떻게 동작하는지도 잘 알아야 하며, 운영체제가 뭔지에 대해서도 잘 알아야 한다... 너무 어렵다... 그래도 능숙해지면엄청난 효율을자랑하기에 잘하면 좋다. 그래서 C++책 중에 기본 지식을 다 익히고 난후에 , 특히 C++을 익힌 상태에서 이 책을 읽다보면 컴퓨터나 OS에 대한 내용들도 많이 등장한다. 이 C++ 최적화에서는 세부적으로 윈도우에서 MSVC컴파일러를 썼을 때 C++코드를 최적화 하는 방안들에 대해서 알려준다. 어느 최적화와도 마찬가지로
리뷰에 앞서 본 리뷰는 한빛 출판 네트워크에서 진행한 ‘나는 리뷰어다’ 이벤트에서 제공받은 책으로 진행한 것을 밝힙니다.
보통 프로그램을 작성할 때, 어떤 프로그램 언어를 이용해 목적하는 기능을 어떻게 구현하는 것에 대해 신경을 쓴다. 동작 시간과 관련한 요구사항이 특별히 없다면 프로그램이 원하는 대로 동작하면 거기서 프로그램 작성은 완료일 것이다. 하지만, 상업용으로 사용되는 프로그램의 경우 시간에 대한 요구사항은 항상 포함된다. PC나 서버에서 동작하는 프로그램부터 아주 작은 크기의 임베디드 시스템에서 동작하는 프로그램까지 아주 다양한 분야에서 다양한 요구사항이 존재한다. 그래서 하드웨어 제약(CPU 속도, 메모리 용량, 배터리 이용 유무 등)이 있으면서도 빠른 속도를 요구하는 시스템에서는 C, C++과 같은 언어를 이용하여 프로그램을 개발하는 경우가 많다. 프로그래밍 언어를 C, C++로 선택했다고 해서, 성능이 원하는 대로 빠르게 나올 수는 없기 때문에, 코드 작성 시 시간 제약을 맞추기 위해, 많은 시간을 최적화에 쏟을 수 밖에 없다. 최적화된 프로그램을 작성하기 위해, 많은 시간을 할애하지만 어떻게 하면 최적화를 할 수 있다는 정답은 없다고 생각한다. 내가 작성한 프로그램이 어떤 CPU와 어떤 메모리를 갖추고 있는 프로그램에서 돌고 있는 지, 어떻게하면 동일 연산을 수행하더라도 메모리 접근을 줄일 수 있는 지, Cache 활용은 어떻게 해야하는지 등 단순 언어의 지식만이 아닌 아키텍쳐적인 지식 및 지금까지 최적화를 하면서 겪은 경험도 중요하다고 생각한다.
업무에서 주로 C 언어로 코드를 작성해 왔기 때문에, C++로 코드를 작성하기 전까지는 C 언어나 어셈블러 레벨의 최적화 자료들을 많이 찾아보았었다. 하지만 C나 어셈블러 그리고 컴파일러의 특성을 이용한 최적화 기법이나 사례들을 정리해 놓은 책들의 수가 많지 않고, 여러 권의 책을 읽어보아도 중복되는 내용이 많아, 아무래도 좀 더 정리되어 있는 자료가 있으면 좋겠다 싶은 아쉬움을 늘 가지고 있었다.
본 책을 리뷰하면서 느낀 점은 저자가 직접 경험하면서 느낀 내용들을 주제별로 그리고 C++이라는 언어가 가지는 특성과 잘 조합하여 정리해 두었다는 점이다. 그리고 주제별로 성능에 영향을 많이 줄 만한 부분들을 다루고 있어, 필요할 때 찾아보기가 쉽게 되어있다는 점도 이 책의 장점이라고 생각한다.
C언어로 개발을 할 때는 못 느끼다가, C++을 이용해서 개발을 하기 시작했을 때, 제일 먼저 어찌해야 할지 답을 잘 찾지 못했던 것이 상당히 많이 이루어지는 메모리 복사이다. C언어와 달리 풍부한 라이브러리가 기본 제공되고, 사용하기 편하기 때문에 무턱대로 사용을 하게 되는데, 이러한 측면은 아무래도 성능에 영향을 많이 주게 된다. 그리고 어떠한 기능을 구현할 때, 여러 템플릿 중 어느 것을 이용해 구현해도 구현을 할 수 있으나, 어떤 것이 더 효율적인 지를 잘 모르는 경우가 있는데, 저자는 이런 부분들에 대해서도 상세히 설명해 주고 있다. 따라서 경험이 적은 C++ 개발자의 경우, 이 책이 상당히 도움이 될 것이라 생각한다. 물론 C++ 을 오랫동안 개발을 해 왔지만, 성능적인 측면을 크게 고려하지 않고 개발을 해 온 개발자들에게도 좋은 조언이 될 수 있는 부분이 많다고 생각한다.
이 책은 Cache level 최적화와 같이 특정 아키텍쳐에 의존적인 내용이나 병렬처리 알고리즘이나 병렬처리를 위한 SSE, AVX 등의 SIMD instruction 사용 기법을 고려한 내용은 다루고 있지 않다. 또 컴파일러 레벨의 최적화 원리 설명이나 linker를 이용한 성능 향상 등의 주제는 다루지 않으므로 관련 내용이 필요한 분들은 다른 책을 참고할 필요가 있다.
이 책을 읽고 예제를 이해하기 위해서는, C++의 문법과 동작 원리를 어느 정도 이해하고 있어야 한다. 그리고 저자가 모던 C++11과 같은 모던 C++의 문법도 이용하여 설명을 하고 있어, 관련 문법도 알고 있으면 더 좋을 것이라 생각한다. 책 내용 자체가 쉽지 않기 때문에, C++ 초보자를 위한 책은 아니지만, 최적화를 고려하는 최적화 초보자 분들께는 좋은 지침서가 될 것으로 생각된다.
다양한 방면에서 아주 소중한 우리 C++을 더욱더 잘 쓸 수 있도록 가이드해주는 C++ 최적화 책이 출간되었다! 한빛미디어에서 리뷰어로 읽을 수 있게 해주어서 너무나도 기쁘다.
C++을 더욱더 잘 쓰려면 컴퓨터 구조와 구동하는 방식에 대해서 잘 알아야 하며, 컴파일러가 어떻게 동작하는지도 잘 알아야 하며, 운영체제가 뭔지에 대해서도 잘 알아야 한다... 너무 어렵다... 그래도 잘 쓰면 엄청난 퍼포먼스를 자랑하기 때문에 꼭 마스터가 되고 싶다. 그래서 C++책 중에 다양한 책이 있지만 특히 C++을 어떻게 하면 잘 쓰냐에 대한 책들을 읽다보면 위에서 말한 컴퓨터나 OS에 대한 내용들도 많이 등장한다. 이 C++ 최적화에서는 세부적으로 윈도우에서 MSVC컴파일러를 썼을 때 C++코드를 최적화 하는 방안들에 대해서 알려준다. 어느 최적화와도 마찬가지로 항상 최적화는 실험과학적이다. ㅋㅋ
항상 책 마지막 부분에 마치면서 이 장에서 다루었던 내용들을 쉽게 요약해두어서 정말 보기 편하다. 책을 읽으면서 항상 내용에 대해서 생각하며 읽어야 하는데, 그럴 시간이 없다면 무작정 이 마지막 페이지만 읽어도 뭐 나쁘진 않을 것 같다는 생각을 한다. 가까운 책장에 꽂아두고 항상 보고 읽을만한 좋은 책인 것 같다.
C++11에 관한 내용들도 언급하고 있다. rvalue reference, std::move과 같은 C++11에서 다루는 내용들도 어떻게 최적화 할 것인지 다루고 있다. 구식 책은 아니라는 점.
항상 최적화와 아름다운 구조간의 중간지점 타협을 찾아야 한다. 구조가 예뻐서 코딩하는데 쉽고 빠르고 간편하게 하고 싶지만 성능도 빠르게 하고 싶은게 프로그래머 마음일 것이다. C++은 둘다 잡을 수 있는 기회를 제공해준다. 근데 실력에 따라 둘다 놓칠 수도 있다. 항상 주의해가면서 써야하는게 C++인것 같다. 최근에 연구하면서 후위 증가 연산자를 한문장에 여러 번 쓴 적이 있는데, 그것을 디버깅한다고 꼬박 이틀이 날라갔다.
이 책은 Effective C++ 시리즈 처럼 어떻게 하세요~ 이런식으로 나와있지만 다루는 내용들은 전부 최적화와 관련된 내용이라서 좋았다. 저자가 직접 자기 환경에서 실험해보면서 어떻게 최적화 하는게 좋은지 상세히 알려주고 있어서 신뢰도 생긴다. 이 책을 통해 내 연구 소스코드도 좀 손봐야 할 곳이 많다는 생각이 들었다.
C++이 생겨난지도 이제 근 25년이 다되어가고 있다. 그 기간동안 무수히 많은 명세가 제안되었고 기능적으로 효율적으로 상당한 진보를 이루어워왔다. 이런 파고의 과정을 거치다 보니 C++만큼이나 다양한 어프로치와새로운 인사이트 그리고 최적화 이론이 등장한 언어도 없을 것이라 생각된다. 위의 언급한 것들 중에, 본 서는 특히 C++을 어떻게하면 최적화 할 수 있는지에 집중하고있다. 가령 C++의 코드를 최대한 버퍼에 올리거나 혹은필요없는 로직들 등을 없엠으로써 효율 향상을 시키는 방법 등을 말이다.
【어떤 독자를 위한 책인가】
이 책은 그림은 상당히 적고 글이 대부분인 책이다. 글보단그림 위주로 책을 읽으며 학습하기 좋아하는 분이라면 위 책을 선택하는 것은 어찌보면 잘못된 선택일 수 있다. 또한 C++의 성능 향상 이슈를 다루다보니 C++의 기본 지식과 이에 필요한하드웨어 지식등을 요하고 있다. 따라서 대학교 학부 수준의 전산학 지식을 가지고 있지 않은 독자가 있다면이해하는데에 어려운 부분이 있을 것이라 생각된다. (물론 책에서 자세히 설명하고 있으나 그 설명만으로전부를 이해하는데엔 확실히 한계점이 있어 보였다.) 결론적으로, 위책은 자신이 C++의 동작 원리와 기본기에 대해 어느정도 숙달되었고,또한 하드웨어 이론에 대해서도 어느정도 이해하고 있는 독자를 대상으로 하고 있다.
【책의 구성】 'C++ 최적화' 책의 구성은어떠한가.
본 서는 스텝 바이 스텝으로책의 내용을 접근하고 있다. 가령 하드웨어부터 시작하여 하드웨어를 제어하기 위한 C++에 이르기까지 바텀-업 방식을 취하고 있기에 학습하기에 매우좋은 구성을 하고 있다. 또한 위 책은 다양한 수치를 독자에게 제공함으로써 책에서 제안하고 있는 최적화이론의 논리적 근거를 명백하게 제시하고 있다. 따라서 실험이나 최적화 이슈로 고민하는 사람이 있다면이를 확실한 근거로 삼아도 좋을 것이라 생각한다.
다만 위에서 언급했던 것처럼 책의 대부분이 글로 이루어져 있고, 각 쳅터별로 서두 본론 정리식의 구성을 취하여 나름의 체계성을 가추어져 있으나, 자칫하면 약간 지루함에 빠질 수 있는 오류가 있다. 이 부분만을 주의해서 차근 차근 공부해간다면 최적의 효율을 취할 수 있을것이라 기대한다.
【C++최적화를 읽으며…….】
리뷰어는 지난 20년 가까이 C와 C++을 전공해왔다. 그렇기에그 긴 세월 동안 C/C++이 어떤식으로 변해왔는지 멀리서나마 지켜볼 수 있었는데, 요즘 만큼 활발히 C/C++이 변화하는 시대도 없는 듯했다. (이렇게 고인 언어가 말이다!!) 또한 웹 프레임 워크가 중요해지는시대이다 보니, 다양한 웹관련 언어들이 탄생하고 소멸하고 다시 나타나고를 반복하고 있다. 이런 시대일 수록 기초 언어 하나를 최적으로 학습한다면 다른 언어들을 학습함에 있어 큰 어려움이 없을 것이라기대해본다.
그림은 조금 부족하지만 읽는데는 전혀 무리가 없습니다. 꽤나 잘 읽혔는데, 자료구조나 컴퓨터 구조와 같은 컴퓨터 관련 학과라면 알 수 있는 내용 기반으로 이루어져 있기 때문에 잘 읽히는 것 같습니다. 또, 목차가 세부 목차까지 잘 나눠져 있고 길이가 길지 않아서 잘 읽혔던 것 같습니다.
대상 독자
C++ 프로그래머
소프트웨어 최적화가 필요한 사람 (특히 C++)
전체 페이지 수
473p
출판사 책 소개
[빠르고 간결한 C++을 위한 프로의 최적화 팁! ]
[빠른 코드를 작성하는 시간은 느린 코드를 작성하는 시간보다 결코 길지 않다. 이 책은 올바른 코드를 구현하면서도 빠른 C++ 프로그램을 만드는 최적화 방법을 소개한다. 습관적으로 쓰는 C++ 구문을 점검해보고 싶다면 35년 경력의 저자가 소개하는 10가지 기법으로 시작해보자. 자원을 소비하고 실행 시간을 잡아먹는 부분을 찾아내 개선하다 보면 "와, 정말 빠른데! 누가 고쳤지?!"라는 말을 듣게 될지도 모른다. 실제 사례에 기반한 실용적인 팁으로 진정한 프로가 되어보자.]
[C++은 자동화와 표현력부터 성능을 향상시키는 세밀한 제어까지, 다양한 옵션을 제공한다. 그래서 C++로 만든 프로그램에는 최적화할 여지가 곳곳에 숨어 있다. '코드를 제대로 작성하고 있는 걸까?' 의심이 든다면 지금 최적화를 시작해보자. 프로그램 속도를 느리게 하는 '유력 용의자'를 검거하는 방법은 알고 보면 놀라울 정도로 간단하고 명쾌하다. 저자가 소개하는 풍부한 팁과 예제를 활용해 연습하다 보면 금세 뛰어난 성능을 내면서 가독성까지 높은 코드를 작성할 수 있다.]
[[이 책에서 다루는 10가지 최적화]] [_1. 성능에 영향을 주는 컴퓨터 하드웨어 기본 지식] [_2. 프로파일러와 소프트웨어 타이머를 활용한 측정 기법] [_3. 최신 C++에서 문자열의 기능을 최적으로 조합하는 방법] [_4. 비효율적인 알고리즘을 개선하고 C++ 코드의 행동 패턴을 참조해 최적화하는 방법] [_5. 동적 할당 변수를 제대로 사용하고 메모리 관리자의 호출 횟수를 줄이는 방법] [_6. 실행에 불필요한 명령어를 제거하여 문장 수준에서 최적화를 이루는 방법] [_7. 처음부터 고성능을 목표로 하는 라이브러리를 설계하는 방법] [_8. C++ 컨테이너 클래스의 장점과 단점을 이해하고 활용하는 방법] [_9. C++ 스트리밍 입출력 함수를 효율적으로 사용하는 방법] [_10. 그 외 성능 저하를 일으키는 요인을 찾아내고 수정하는 방법]
목차
CHAPTER 1 최적화란 __1.1 최적화는 소프트웨어 개발의 일부입니다 __1.2 최적화는 효과적입니다 __1.3 최적화해도 괜찮습니다 __1.4 여기에 나노초, 저기에 나노초 __1.5 C++ 코드 최적화 전략 요약 __1.6 마치며
CHAPTER 2 컴퓨터 하드웨어와 최적화 __2.1 C++은 컴퓨터의 거짓말을 믿습니다 __2.2 컴퓨터의 진실 __2.3 C++도 거짓말을 합니다 __2.4 마치며
CHAPTER 3 성능 측정 __3.1 사고방식 최적화 __3.2 실험 수행 __3.3 프로그램 실행 프로파일 __3.4 시간이 오래 걸리는 코드 __3.5 코드 비용 추정하기 __3.6 최적화할 코드를 찾는 다른 방법 __3.7 마치며
CHAPTER 4 문자열 최적화 __4.1 문자열이 왜 문제인가요 __4.2 문자열 최적화 첫 번째 시도 __4.3 문자열 최적화 두 번째 시도 __4.4 문자열 변환 연산 제거하기 __4.5 마치며
CHAPTER 5 알고리즘 최적화 __5.1 알고리즘의 시간 비용 __5.2 검색과 정렬을 최적화하는 툴킷 __5.3 효율적인 검색 알고리즘 __5.4 효율적인 정렬 알고리즘 __5.5 최적화 패턴 __5.6 마치며
CHAPTER 6 동적 할당 변수 최적화 __6.1 C++ 변수 __6.2 C++ 동적 변수 API __6.3 동적 변수 사용 줄이기 __6.4 동적 변수의 재할당 줄이기 __6.5 불필요한 복사 제거하기 __6.6 이동 문법 구현하기 __6.7 평평한 자료구조 __6.8 마치며
CHAPTER 7 문장 최적화 __7.1 반복문에서 코드 제거하기 __7.2 함수에서 코드 제거하기 __7.3 표현식 최적화 __7.4 제어 흐름 최적화 __7.5 마치며
CHAPTER 8 라이브러리 최적화 __8.1 표준 라이브러리 최적화 __8.2 기존 라이브러리 최적화 __8.3 최적화된 라이브러리 설계 __8.4 마치며
CHAPTER 9 검색 및 정렬 최적화 __9.1 std::map과 std::string을 사용한 키/값 테이블 __9.2 검색 성능 향상을 위한 툴킷 __9.3 std::map을 사용한 검색 최적화 __9.4 헤더를 사용한 검색 최적화 __9.5 해시 키/값 테이블 검색 최적화 __9.6 스테파노프의 추상화 패널티 __9.7 C++ 표준 라이브러리로 정렬 최적화 __9.8 마치며
CHAPTER 11 입출력 최적화 __11.1 파일을 읽는 방법 __11.2 파일 쓰기 __11.3 std::cin으로 읽어서 std::cout으로 쓰기 __11.4 마치며
CHAPTER 12 동시성 최적화 __12.1 동시성 __12.2 C++ 동시성 기능 __12.3 C++ 프로그램 스레드 최적화 __12.4 더 효율적인 동기화 만들기 __12.5 동시성 라이브러리 __12.6 마치며
CHAPTER 13 메모리 관리 최적화 __13.1 C++ 메모리 관리 API __13.2 고성능 메모리 관리자 __13.3 클래스 한정 메모리 관리자 제공하기 __13.4 사용자 정의 표준 라이브러리 할당자 제공하기 __13.5 마치며
후기
최적화는 프로그래밍에 있어서 반드시 필요합니다. 같은 기능을 가진 프로그램이라고 해도 어떻게 짜느냐에 따라서 성능은 천차 만별입니다. 지도 어플이 검색을 할 때, 검색이 10분씩 걸린다고 하면 아무도 사용하지 않겠죠. 네이버, 구글 지도 어플처럼 검색하고나서 수 초 이내에 결과가 나와야 합니다.
성능에는 알고리즘이나 하드웨어(예를 들면, 임베디드 환경이나 서버 환경에서의 코드는 다를 수 밖에 없겠죠.), 라이브러리를 사용하는 방법, 사용하는 자료구조의 유형 등 다양한 요소들이 영향을 주게 됩니다. 속도, 공간, 전력 등의 다양한 요소들을 고려하여 최적의 코드를 짜는 것이 필수적입니다. 이 책에서는 C++ 을 기준으로 최적화하는 방법을 설명해주고 있습니다. 해당 기법이 다른 언어에도 통할 수 있지만, 환경에 따라서는 통하지 않을 수 있습니다.
책에서 크게 최적화해야 할 요소들로 지정하는 것은 아래와 같습니다. 후기에서 전부 언급하기는 어려우니, 어떠한 방식으로 적용해야 할지는 세세하게 읽어보면서 확인하면 좋을 것 같습니다. 틈나는 대로 책을 읽고 실제로 적용하면 큰 도움이 될 것이라고 생각됩니다.
더 좋은 컴파일러와 최적화 설정
최적 알고리즘
좋은 라이브러리
메모리 할당 줄이기
복사 줄이기
계산 제거
최적 자료 구조 사용
동시성 증가
메모리 관리 최적화
주요 책의 내용 중, 인상 깊은 내용을 적어보려고 합니다.
먼저, 하드웨어 적인 측면입니다. 요즘 하드웨어적인 관심도가 높아져서 더 인상깊게 느껴졌습니다. 초반에 하드웨어 적인 측면을 소개할 때, excution, fetch와 같은 하드웨어적인 단계단계들을 쉽게 소개해줘서 좋았습니다. 내용이 다소 어렵지 않을까 걱정했었는데, 최대한 쉽게 설명해주려고 풀어서 알려주는게 좋았습니다.
프로세서가 1달러도 하지 않는 저렴한 mhz 부터 Ghz까지 수 많은 종류가 존재한다고 언급하면서, 종류와 관련 없이 중요한 점을 알려주고 있습니다.
메모리 접근은 프로세서보다 느리다.
메모리는 워드 단위로 접근하기 때문에, 얼만큼 한 번에 읽어오는지 파악해야 한다.(1byte 부터 64byte까지 한 번에 가져오는 양이 프로세서마다 다름. 어떤 데이터형을 가져오냐에 따라서 동일한 값이지만, 메모리에 여러 번 접근해야 할 수 있다.)
인접 위치 메모리를 더 빨리 접근한다.
메모리는 용량이 제한되어 있기 때문에, 가상 메모리를 사용할 수 있다. 페이지 스레싱(메모리에 데이터가 없는 경우, 페이지 펄트 발생. 페이지 스레싱은 페이지 펄트가 실제 수행 보다 시간이 많이 걸릴 경우를 말함) 문제가 존재할 수 있다.
운영체제 기능을 호출하려면 메모리 접근이 필요하기 때문에, 속도가 느려질 수 있습니다.
점프나 함수 호출 같은 경우는 context switch 과정이 필요하기 때문에 비용이 많이 발생할 수 있다.
하드웨어적인 내용은 크게 위와 같고, 보편적인 내용을 다루고 디테일 하게 다루지는 않는 것 같습니다. 실제 사례가 적혀 있었으면 조금 더 좋았을 것 같은데, 그러한 점은 다소 아쉽습니다.
다음으로는 입출력 최적화입니다. 입출력은 항상 이루어지는 과정이고, 가장 속도가 느린 보조기억장치를 접근하기 때문에, 가장 중요한 요소가 될 수도 있습니다. 주요 내용은 아래와 같습니다.
한 번에 한 줄씩 읽기
더 큰 입력 버퍼를 사용하여 파일 읽기 성능을 향상시키기
c++ 에서 주로 사용하는 std::endl 과 같은 연산자는 출력을 비우기 때문에 콘솔 출력을 하지 않는 다면 비용이 오래 걸릴 수 있다.
위와 같은 내용들이 주요 개념이고, 하드웨어 부분보다는 조금 더 디테일하고 c++의 함수를 사용해야 되는지 나와있었습니다. 보조기억장치가 느리기 때문에 위와 같은 특성을 생각하면서 프로그래밍을 하면 실제 성능에 큰 도움이 될 것이란 생각이 들었습니다. 알고리즘을 공부하면서 조금 추상적으로 알았던 내용을 좀 더 디테일 하게 알 수 있었습니다.
입출력에서 가장 좋았던 점은 실제 시간을 측정하고 어떻게 성능이 나오는지 비교해서 보여준다는 것입니다. 그냥 단순히 '이렇기 때문에 이렇다' 라기 보다는 실제 수치로 보여주기 때문에, 훨씬 더 감이 잘 오는 것 같습니다.
이외에도 다양한 최적화 방법이 서술되어 있습니다. 동시성, 문장, 라이브러리 같은 내용도 읽어보면 도움이 많이 될 것 같다고 생각됩니다. 책의 절반 정도는 디테일한 내용 보다는 전반적으로 훑고 넘어간다는 느낌이었고, 절반 정도는 c++의 실제 함수와 시간을 보여주면서 디테일하게 보여주는 것 같습니다.
다양한 방법에 대해서 어떤 것인지도 몰랐던 것을 알게 된다면, 향후 필요한 최적화를 찾아서 할 수 있기 때문에 읽어보면 좋은 책이라고 생각합니다. 저는 상대적으로 좀 약한 c++관련 효율화 부분을 틈나는 대로 더 자세히 읽어봐야겠습니다.