메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

한빛랩스 - 지식에 가능성을 머지하다 / 강의 콘텐츠 무료로 수강하시고 피드백을 남겨주세요. ▶︎

C++ 최적화 : 최고 성능을 구현하는 10가지 검증된 기법

한빛미디어

번역서

판매중

  • 저자 : 커트 건서로스
  • 번역 : 옥찬호
  • 출간 : 2019-07-05
  • 페이지 : 474 쪽
  • ISBN : 9791162241981
  • 물류코드 :10198
  • 초급 초중급 중급 중고급 고급
4.8점 (25명)
좋아요 : 66

빠르고 간결한 C++을 위한 프로의 최적화 팁! 

 

빠른 코드를 작성하는 시간은 느린 코드를 작성하는 시간보다 결코 길지 않다. 이 책은 올바른 코드를 구현하면서도 빠른 C++ 프로그램을 만드는 최적화 방법을 소개한다. 습관적으로 쓰는 C++ 구문을 점검해보고 싶다면 35년 경력의 저자가 소개하는 10가지 기법으로 시작해보자. 자원을 소비하고 실행 시간을 잡아먹는 부분을 찾아내 개선하다 보면 “와, 정말 빠른데! 누가 고쳤지?!”라는 말을 듣게 될지도 모른다. 실제 사례에 기반한 실용적인 팁으로 진정한 프로가 되어보자.

 

출판사 리뷰

C++은 자동화와 표현력부터 성능을 향상시키는 세밀한 제어까지, 다양한 옵션을 제공한다. 그래서 C++로 만든 프로그램에는 최적화할 여지가 곳곳에 숨어 있다. ‘코드를 제대로 작성하고 있는 걸까?’ 의심이 든다면 지금 최적화를 시작해보자. 프로그램 속도를 느리게 하는 ‘유력 용의자’를 검거하는 방법은 알고 보면 놀라울 정도로 간단하고 명쾌하다. 저자가 소개하는 풍부한 팁과 예제를 활용해 연습하다 보면 금세 뛰어난 성능을 내면서 가독성까지 높은 코드를 작성할 수 있다.

 

[이 책에서 다루는 10가지 최적화]

  1. 성능에 영향을 주는 컴퓨터 하드웨어 기본 지식
  2. 프로파일러와 소프트웨어 타이머를 활용한 측정 기법
  3. 최신 C++에서 문자열의 기능을 최적으로 조합하는 방법
  4. 비효율적인 알고리즘을 개선하고 C++ 코드의 행동 패턴을 참조해 최적화하는 방법
  5. 동적 할당 변수를 제대로 사용하고 메모리 관리자의 호출 횟수를 줄이는 방법
  6. 실행에 불필요한 명령어를 제거하여 문장 수준에서 최적화를 이루는 방법
  7. 처음부터 고성능을 목표로 하는 라이브러리를 설계하는 방법
  8. C++ 컨테이너 클래스의 장점과 단점을 이해하고 활용하는 방법
  9. C++ 스트리밍 입출력 함수를 효율적으로 사용하는 방법
  10. 그 외 성능 저하를 일으키는 요인을 찾아내고 수정하는 방법
커트 건서로스 저자

커트 건서로스

35년 경력 소프트웨어 개발자. 25년 동안 윈도우, 리눅스, 임베디드 장치에서 C++ 코드를 개발했다. 업무 시간 외에는 아내 그리고 네 아들과 함께 지내며, 현재 워싱턴 주 시애틀에 산다.

옥찬호 역자

옥찬호

넥슨 코리아에서 근무하는 게임 프로그래머. C++과 게임 개발, 컴퓨터 그래픽스, 오픈 소스, 강화학습에 관심이 많으며 페이스북 C++ Korea 그룹의 운영자 및 마이크로소프트 MVP로 활동하고 있다. 남는 시간엔 학생들과 다양한 오픈 소스 프로젝트를 진행하며 더 나은 미래를 꿈꾸고 있다. 옮긴 책으로는 『러스트 핵심 노트』(한빛미디어, 2017), 『게임샐러드로 코드 한 줄 없이 게임 만들기』, 『유니티 Shader와 Effect 제작』 , 『2D 게임 프로그래밍』(이상 에이콘출판사), 『모던 C++ 입문』(길벗, 2018)가 있다.

 

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 <algorithm> 헤더를 사용한 검색 최적화

9.5 해시 키/값 테이블 검색 최적화

9.6 스테파노프의 추상화 패널티

9.7 C++ 표준 라이브러리로 정렬 최적화

9.8 마치며


CHAPTER 10 자료구조 최적화

10.1 표준 라이브러리 컨테이너 알아보기

10.2 std::vector와 std::string

10.3 std::deque

10.4 std::list

10.5 std::forward_list

10.6 std::map과 std::multimap

10.7 std::set과 std::multiset

10.8 std::unordered_map과 std::unordered_multimap

10.9 다른 자료구조

10.10 마치며

 

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 마치며

최적화는 최적화 자체의 효과가 아닌, 그 과정에서 개발자가 고민하고 깨달아야 하는 것에 본질이 있다. 이 책은 C++ 자체의 특성만으로 개발자가 무엇을 고민해야 하는지, 어떤 목적을 이루어야 하는지를 잘 짚고 있다.

__박수현, 『Thinking about C/C++』 저자

 

사례에 기반한 풍부한 조언의 보고! 이 책이야말로 최신 C++을 위한 믿을 만한 참고서다.

__제리 탄, 미국 청산예탁결제원(DTCC) 시니어 소프트웨어 개발자



20191117_132523.jpg

 

 

 

 

 

최적화에 대한 기본부터 시작한다.

책 자체가 C++ 기반으로 쓰여져 있고, 초중반부부터는 오로지 C++ 최적화를 목적으로만 쓰여진 책입니다만, 다른 언어에도 적용할 수 있는 최적화의 기본 내용을 먼저 다루기 때문에, 다른 언어에서도 놓치고 가는 반복적인 작업이나 실수를 줄일 수 있게끔 해주는 책이 될 수 있을 것이라 생각됩니다.

 

 

사소한 부분에서 놓치는 C++ 최적화에 대해 자세히 이야기하고 있다.

아무 맥락 없이 대뜸 이런 부분에서 최적화를 할 수 있으니 이렇게 해야 한다고 말하면서 최적화 방법을 강제하지 않습니다. C++의 표준을 따지고, 실제로 동작이 어떻게 진행되는지 이야기를 하면서, 이런 경우에 대해 어떻게 코드를 작성하는 것이 좋고, 처음 설계 단계부터 어떤 것에 주의를 해야 하는지 이야기를 다룹니다. 문장을 무조건 나열하면서 최적화 방법에 대해서 설명하는 것이 아니라 소제목과 예시 소스코드를 예로 들기 때문에, 술술 읽어나가는 것도 필요한 부분을 찾아 읽는 것도 가능합니다.

 

 

믿고 볼 수 있는 오라일리 미디어의 책이다.

흔히들 말하는 조류 책, 어류 책이라고 불리는 것들이 O'REILLY 미디어를 통해 출판된 책입니다. 오라일리 미디어의 책은 일단 검증되었다는 것이 정설입니다. 모든 책이 그 분야에서 1등이라고 이야기할 수는 없지만, 각각의 분야에서 스테디 셀러로 자리매김하고 있다는 점은 부정할 수 없는 사실입니다. 외국에서도 많은 사람들에게 읽혀진 책이고, 이것을 국내로 들여와 번역하는 과정에서 뛰어나신 현업 개발자 및 번역가분들을 거쳐 완성되기 때문에 충분한 검증 과정을 거친 책으로 믿을 수 있는 책이라는 점입니다.

 

 

 

대상 독자

C++ 개발자

C++ STL 그 너머의 것까지 찾아보려는 학부생




C++ 최적화

작가
커트 건서로스
출판
한빛미디어
발매
2019.07.05.

리뷰보기


 
 
최적화에 대한 책이라고 해서 최적화 방법만 사전식으로 나와있을 줄 알았는데 내용이 생각보다 다양하다.
먼저 최적화의 필요성과 컴퓨터 과학의 기본 지식을 설명해준다. 전반적인 개요 설명이 충분하고, 이후 성능 측정 방법과 최적화 방법에 대해 설명해준다.

 

앞의 필요성과 개요 부분만 봐도 상당히 중요한 내용이 많다고 생각한다.

성능 측정을 위한 방법도 설명해주고 이런 방법의 다양함과 테스트 방법 및 결과들을 체계적으로 정리하고 문서화하는 것에 대한 중요성, 또 증명해야 하는 목표까지 비단 최적화뿐만 아니라 개발 전반에 있어서 꼭 알아두어야 할 내용이 들어있다.

 

약간 너무 깊이 들어가는 게 아닌가 싶은 부분은 시간 측정에 필요한 '시간'에 대해 알려주는 부분이다. 어떻게 정확하게 측정할 수 있을까에 대한 내용인데, 진자시계부터 전자시계 등 백과사전에서나 볼법한 예시를 들어줘서 상당히 재미있었다. 또 시스템에서 시간 값을 반환해주는 여러 가지 함수에 대해서도 소개해주었다.

 


 

최적화 방법에 대해 알려주는 부분은 이해하는데 어려움이 좀 있었다. c++보다는 c 위주로 작업을 하고 있어서 클래스나 자원 할당에 대한 부분이 익숙하지 않아서 예제를 봐도 와닿지(?) 못하는 부분이 꽤 있어서 아쉬웠다. 기술적으로는 많은 도움이 되었다. c나 다른 언어에도 적용할 수 있는 방법도 많았고, 지금껏 생각하지 못한 새로운 아이디어처럼 느껴지는 방법도 있었다. 입문자보다는 어느 정도 실전 경험이 있는 사람이라면 정말 큰 도움이 될 책이라고 생각한다. 예제 코드만 봐도 몇 줄 수정하지 않고 20%씩 성능이 오르는 걸 보면 담당하는 제품에도 이런 식으로 적용하면 마법같이 빨라지겠다 싶은 생각과 함께 코딩 욕구가 솟아오르기도 한다. 개발 참고서라 그렇게 중요하지는 않은 부분이지만 직역하는 느낌에 읽다가 흐름이 끊기는 부분이 몇 번 있었던 것 같다.

KakaoTalk_20191115_114401572.jpg

 

 

프로그래밍을 공부하다보면 자주 듣는 말이 책 좀 그만보라는 말 입니다.

컴퓨터공학은 책으로 공부하는게 아니라 인터넷으로 공부하는 거라고도 합니다.

어떤 말인지 이해는 하겠다만 기계공학과 출신이여서 그런지 책으로 공부하는게 마음이 편합니다.

그리고 뭔가 여러 사람들이 인터넷 만능설을 가지고 있는 듯한 느낌이 듭니다.

 

 

책의 서론부터 참 재밌는 내용이 나옵니다.

'21세기 초 C++은 공격을 받았습니다. ··· ··· ··· 많은 유명 기업들은 독점 객체지향 언어를 홍보하면서

C++은 사용하기 너무 어려우며 자신들이 만든 언어가 미래라고 주장했습니다. ··· ··· ···

프로세서 코어의 속도는 빨라지지 않았고 작업량은 계속 늘어났습니다.

대기업들은 확장설 문제를 해결하기 위해 C++ 프로그래머를 고용하기 시작했습니다.'

 

 

이전 리뷰에서도 자주 언급했지만, 난 엔지니어 포프님의 사상을 좋아한다.

포프TV를 자주보는데, 그 중 '프로그래머로 살아남기 위해 필요한 언어 둘' 이라는 영상이 있다.

영상의 내용을 요약하면 필요한 언어 2개란,

1) 메모리를 직접 관리해줘야하는 언어(C, C++ 등)이고

2) 메모리를 알아서 관리해주는 언어(C#, JAVA, Python 등) 이라는 것이다.

무어의 법칙에 따라 프로세서 코어의 속도는 크게 향상되지 않고 있다.

이러한 상황에서 대규모 프로그램을 한정된 메모리 안에서 돌리기 위해서는

당연히 메모리를 직접 관리해주는 언어가 필요하다.

 

 

메모리를 직접 관리해주는 것 까지는 좋다.

프로그래밍을 해본 사람은 알테지만 똑같은 문제를 보고 같은 기능을 하는 프로그램을 구현했다고 하자.

재밌는건 사람마다 프로그램의 성능이 전부 다르다는 것이다.

쉽게 말해 코드를 어떻게 작성했느냐에 따라 성능이 천차만별이 된다.

프로그래밍을 소개하는 책은 수두룩 하지만 이런식으로 성능에 관련된 책은 극히 드물다.

따라서 'C++ 최적화' 책은 중급 프로그래머라면 반드시 봐야하는 책이라고 생각한다.

 

 

책의 구성으로는 최적화가 무엇인지를 소개하는 챕터부터 시작해서, 하드웨어 최적화,

성능 측정, 동적 할당 변수 최적화, 자료구조/알고리즘 최적화 등등이다.

프로그래밍을 하면서 자주 사용하는 것들에 대한 어떻게 최적화하는지를 가르쳐줍니다. 

 

주로 게임 프로그래머처럼 응답속도나 실행시간에 민감한 업계에 종사하는 분들이 보시면 좋다고 생각합니다.

책의 중간에도 '코딩하기 쉬운 알고리즘을 사용해 프로그램을 개발한 다음,

프로그램의 실행 속도가 너무 느리면 되돌아가서 다시 최적화하는게 좋다' 라고 나옵니다.

저자는 차라리 처음부터 올바른 방법을 사용하고 하나의 알고리즘만 디버깅하는 편이 낫다라고 말합니다.

개인적으로는 전자가 더 우선시 되어야한다고 생각합니다.

 

책은 난이도는 그렇게 높지 않다고 생각합니다.

지난번 C++ 책의 내용에 비하면 읽기가 수월합니다.

다만 어떤 방법의 최적화가 더 좋은지는 알겠으나 당장 쓸 일이 없습니다.

따라서 이미 프로그램을 개발하고 성능을 디버깅하는 프로그래머 수준 정도에서 보는게 가장 좋다고 생각합니다.

지금까지 수많은 프로그래밍 언어가 개발되고 사용되었지만 C/C++ 처럼 그 역사가 오래되었음에도 현재까지 꾸준히 사용되고 있는 언어는 드물다. 많은 기능과 쉬운 사용법을 주장하는 최신 프로그래밍 언어들 사이에서도 C/C++이 여전한 인기를 유지하는 비결은 무엇일까? 그것은 바로 C/C++로 개발된 프로그램의 성능 아닐까 생각한다.

 

최근에는 하드웨어의 눈부신 발전으로 최적화의 중요도가 많이 줄어든 것은 사실이다. 하지만 최적화를 통해 성능이 낮은 하드웨에서도 문제없이 프로그램을 돌아가게 하거나, 서버 프로그램의 최적화를 통해 동시 유저 수를 늘릴 수 있다면 이는 곧 비용 절약을 통한 이익의 극대화를 추구할 수 있으므로 이러한 관점에서 볼 때 최적화는 여전히 중요하다고 생각된다.

 

이 책에서는 저자의 풍부한 개발 경험을 바탕으로 최적화 시 알아야 할 기초 상식과 방법들을 13장에 걸쳐 설명하고 있다. 각각의 최적화 방법에 대한 자세한 설명과 함께 간결한 예제 코드가 포함되어 있기 때문에 이해하는데 크게 어렵지는 않았다. 하지만 이 책을 읽다보면 C++의 최신 표준 및 STL, 시간 복잡성, 동시성 등의 개념이 나오는데 해당 지식에 익숙치 않은 독자들은 "C++ 최적화"를 읽기 전에 해당 부분들을 선행 학습하길 권하고 싶다.

 

이 책은 비록 C++을 이용한 최적화를 설명한 책이지만 이 책에 나와 있는 기본적인 개념 및 원리들은 다른 언어로 개발을 할 때에도 적용할 수 있겠다는 생각이 들었다. 그리고 단순히 프로그래밍 언어의 문법을 익히고 원하는 동작을 개발하는 수준을 넘어서서 내가 작성한 코드나 사용한 라이브러리가 내부적으로 어떤 식으로 동작하는지를 이해한다면 한 단계 높은 수준의 프로그래머로 발전할 수 있지 않을까 생각하면서 이 글을 마친다.

 

이 책은 C++언어에 대하여 최적화를 하는 방법에 대해서 매우 자세하게 알려주는 책이다.

최신 C++17 기준으로 작성되어 있어 모던 C++을 배우고 이 책을 배우면 좋을 듯하다.

최적화에 대한 개념은 강조하지 않아도 매우 중요한 개념이다.

최적화가 이루어지지 않은 코드는 아무리 빠른 컴퓨터에서도 느리게 동작하고, 최적화가 잘 이루어진 코드는 저사양 PC에서도 빠르게 동작하기 때문이다.

기본적으로 알고있는 개념에서 부터 출발하여 최적화에 대한 개념을 쉽게 잡을 수 있으며 흥미도 높아진다.

C++17의 stringstream에 대한 소개도 빠지지 않았다.

아마 컴퓨터과학과를 전공하고 있는 사람이라면 허구한 날 보게 될 빅오에 대한 개념을 다시 설명하고 있다. 사실 알고리즘 최적화에 대한 설명에 대해서 빅오 노테이션이라는 개념 이 부분이 빠지면 섭하기도 하다.

놀랍게도 동시성 최적화에 대한 개념도 아주 상세하게 다루고 있다. 갈수록 병렬 프로그래밍에 대한 수요가 많아지고, 이에 대한 깊은 이해가 필수적인데 이러한 개념에 대해서 최적화를 이루는 개념을 다루고 있는 사실은 매우 반가웠으며, 또한 쓸모 있다고 생각한다.

놀랍게도 동시성 최적화에 대한 개념도 아주 상세하게 다루고 있다. 갈수록 병렬 프로그래밍에 대한 수요가 많아지고, 이에 대한 깊은 이해가 필수적인데 이러한 개념에 대해서 최적화를 이루는 개념을 다루고 있는 사실은 매우 반가웠으며, 또한 쓸모 있다고 생각한다.

 

이 책은 철저하게 C++을 중심으로 최적화에 대한 얘기를 이끌어내고 있다. 다른 언어에 대해서는 위의 기법이 활용이 안될 수 있을 뿐더러, 적용되지 않는 상황도 있을 것이다. 하지만 C++을 전문으로 하고 있는 사람에게는 꼭 필요한 책이라고 생각한다.

 

1장

2장

3장

4장

5장

6장

7장

8장

9장

10장

11장

12장

13장

예제

	❯ 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++ 프로그램을 최적화하는 내용을 다룬다. 임베디드 C++ 개발자 경력을 가지고 있으며 성능 향상을 위한 경험사례들을 이야기해 준다.

 

최고 성능을 구현하는 10가지 검증된 기법 내용으로 

1. 성능에 영향을 주는 컴퓨터 하드웨어 기본 지식

2. 프로파일러와 소프트웨어 타이머를 활용한 측정 기법

3. 최신 C++에서 문자열의 기능을 최적으로 조합하는 방법

4. 비효율적인 알고리즘을 개선하고 C++ 코드의 행동 패턴을 참조해 최적화하는 방법

5. 동적 할당 변수를 제대로 사용하고 메모리 관리자의 호출 횟수를 줄이는 방법

6. 실행에 불필요한 명령어를 제거하여 문장 수준에서 최적화를 이루는 방법

7. 처음부터 고성능을 목표로 하는 라이브러리를 설계하는 방법

8. C++ 컨테이너 클래스의 장단점을 이해하고 활용하는 방법

9. C++ 스트리밍 입출력 함수를 효율적으로 사용하는 방법

10. 성능 저하를 일으키는 요인을 찾아내고 수정하는 방법

10가지 기법 중심으로 C++ 설계의 모범 사례를 올바른 코드로 구현하는 방법을 다룬다. C++ 설계를 훌륭하게 구현하면서 올바른 코드를 작성해 거의 모든 컴퓨터에서 실행 속도가 빠르며 자원을 적게 사용하게 바꾸는 방법을 설명하고 있는 점이 책에 장점인데요.

 

최적화라는 분야는 소프트웨어나 하드웨어를 개발하는 필수적인 요소라고 생각한다. 책은 C++ 설계의 모범 사례를 올바른 코드로 구현하는 방법을 다룬다. C++ 설계를 훌륭하게 구현하면서 올바른 코드를 작성해 거의 모든 컴퓨터에서 실행 속도가 빠르며 자원을 적게 사용하게 바꾸는 방법을 설명한다. 주로 설명 글로 되어 있어서 번에 최적화를 마스터하기엔 방대한 양이다. 차근차근 설명을 보고 챕터 속에 작은 상자에 속에 다양한 코멘트 같은 정보들이 담겨 있다. ‘ 잠시 멈추고 생각해봅시다’, ‘최적화 전쟁 이야기 알찬 정보들을 얻을 있는 연구 노트이다. 

 

저서는 C++11 기준으로 설명하고 있으며, 실무에서 C++ 사용 중인 신입, 주니어 개발자에게 도움이 것이다. 하지만 지금의 C++17 릴리즈에도 적용되는 내용이다. 실제 테스트해보고 어떤 것이 효율적인지 어떤 것이 빠르게 연산하는지 확실한 답을 해준다. 단순히 최적화에 대해서 설명해 주는 쉬운 수준의 책이 아니다 컴퓨터 하드웨어 메커니즘에 대한 이해가 어느 정도 있어야 한다. C++ 문법을 전체적으로 파악하고 있거나 실제 여러 코딩 경험이 있는  어느 정도 문법적 지식과 동작 원리를 알아야 도움을 받을 있다.

 

 

 

 

최고 성능을 구현하는 10가지 검증된 기법

개인적으로 최근 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++ 은 하루가 다르게 발전되고 있다.)

 

랭귀지에서의 최적화를 이야기한다.

 

 

 

최적화는 불편하고 재미없으며 어쩌면 요즘엔 더 이상 신경쓰지 않아도 되는

 

편의성의 영역일지도 모르는 주제에 대해 

 

다시금 생각을 환기시켜주는 계기가 되었다.

 

 

 

책의 요점 & 흥미로운 포인트만 읽고 넘기고자 한다면 

 

챕터 10. 자료구조 최적화와 챕터 12. 동시성 최적화 파트를 반드시 읽어보기 권한다.

 

 

 

IMG_3926.JPEG

 

다운로드.png

정말 강력하게 추천하는 책이다. 책의 내용 구성부터 너무나도 알차다. 초반에는 기본적으로 최적화 할 수 있는 방향을 제시함으로써 C++ 을 최적화를 해야하는 이유를 자세히 설명을 해준다. 사실 모든 언어에서도 최적화는 필요로 하지만 방대한 자료와 자율성을 가진 C++ 로써는 최적화의 기법도 상당히 많고, 기괴하다. 개인적으로 C++ 기초 공부하고 Effective C++ 책을 보며 실력을 향상시키는 정석(?) 적인 방향으로 잡았었다면 개인적으론 STL 기본 공부까지 마치고 난뒤 이책을 꼭 보라고 추천하고 싶다. 기본적인 STL을 무작정 사용하지 않고 어떻게 사용하면 효과적으로 성능을 낼 수 있을지 자세히 설명이 되어있다. 또한 STL을 사용하며 주의점도 알려줌으로써 기본적인 STL 사용법을 강화 시켜 줄 수 있을것 같다. 또한 입출력 최적화, 스레드 최적화 메모리 최적화도 설명 함으로써 아주 심화 깊은 얘기를 다룰수는 없는 분량이지만 자신이 조금더 깊은 공부를 하고 싶다면 이책을 꼭 한번 읽고 공부를 하면 좋을 것같다는 생각이 든다. 책의 난이도는 약간 있으니 초심자가 보기는 부담 스러울 수는 있으나, 방대한 양을 설명을 하기보단 기본적이고 핵심적인 최적화를 설명하기에 꼭 읽어보길 추천하며 기본 문법과 간단한 STL 공부는 하고 책을 읽으면 훨씬 많이 도움이 될 책이다.

1

이번 파이콘(2019)에서 파이썬 3.7 어찌 그렇게 빨라졌나세션을 들었다. 해당 세션을 들으면서 CPython에 대한 호기심이 생겼고, 덕분에 C/C++을 좀 더 공부해야겠다고 생각했다. 약 10년 가까이 Java와 Python으로 대부분의 업무를 처리했는데, 아주 어린시절 정말 즐겁게 가지고 놀던 언어인 C/C++에 대한 아련함이 떠올랐지만 너무 오랜 시간 해당 언어를 사용하지 않아서 코드 작성, 개발 환경, 그리고 용례나 관례에 대한 감이 전혀 없는 상태였다.

이것이 책 표지

2

C++ 문법은 예전에 배워서 대충 알고 있다고 생각해서, 문법도 복습하고 요즘 나오는 C++ 용례나 관례를 알아보고 싶었는데, 책에서 C++11, C++14, 그리고 C++17 이런거 보면서 약간 동공지진(!)이 왔다.

C++ 17

대부분의 내용은 일반적인 C++(책을 찬찬히 읽어본 결과 C++11이전?)에 대한 내용은 기본적으로 알아야 읽을 수 있다. 제목에서 «최적화»라고 해서 약간 어렵겠진 생각했는데 C++에 대한 문법 이해와 일반적인 코드 작성 능력만 있으면 읽는데는 크게 무리없을 것으로 생각된다. 앞부분에 개략적인 내용이 나오니 그 부분부터 잘 읽어두면 좋을 듯 싶다. 그리고 «검색 및 정렬 최적화»와 «자료구조 최적화» 부분등과 같이 여러 언어에서 사용하는 기법의 경우 C++ 뿐만 아니라 Java나 Python 등에서 고려해볼만한 내용이 많았다.

3

C++11 이후로 문법에 몇가지 변화가 있었고, 문법뿐만 아니라 개념적으로 변화가 있었던 것으로 보인다. 해당 책에선 C++11 이후의 문법뿐만 아니라 C++11 이전의 경험을 가진 개발자를 위해서 두 가지 설명을 병행해서 하기 때문에 C++ 문법을 아는 개발자라면 코드 리딩 및 작성에서 좋은 지침이 될 것이다.

어색한 맞춤법

번역자분의 C++에 대한 탁월한 식견, 그리고 좋은 번역 덕분에 약간 어렵지만 많은 도움이 되는 책을 읽었다. 덕분에 CPython을 분석하는데 여러가지 도움이 되었다.

모던 프로그래밍 언어가 많이 등장했다. 하지만 아직까지 프로그래밍을 배우는 사람이라면 역시 C와 C++정도는 마주하게 된다.

그 중에서 C++ 기본을 익히고 조금 할 줄 안다 싶을 때 한 단계 업그레이드 하는데 도움을 줄 책이 바로 C++ 최적화(Optimized C++) 이다!

기본서를 보고나면 중급서에 대한 목마름이 찾아온다. 사실 이 책이 중급서 이상으로 느껴질 수도 있다. 하지만 실무에서 C++을 평범하게 사용중인 신입 ~ 주니어 개발자라면 큰 도움이 될 것이라고 생각한다.

사소하지만 한 번 쯤 궁금했을 내용들, 가령 위와 같이 double과 float의 연산속도에 대해서도 이야기한다. 온라인에서 종종 접할 수 있는 질문이고 갑론을박이 오가기도 하는 문제이다.

도움이 되지 않는 것들이라고 해서 좋지 않은 코드에 대해서도 설명한다. 심지어 이건 StackOverFlow에서 가져온 코드이다! 야생의 함수가 나타났다!!!

개발자들이 흔히 참고하는 stackOverFlow의 코드라서 더욱 흥미롭고 모든 답변이 좋은 답변은 아닐 수 있다는 경각심을 일깨워 준다.

너무나 다양한 상황과 꿀팁들이 나열되어 있어서 모두를 소개할 수가 없다. 많은 프로그래머들의 영원한 숙제인 동기화에 대해서도 여러가지 꿀팁을 제공하니 정말 유익한 책이다.

C++ 개발자라면 정말 추천하고 싶은 책이고 사실 다른 언어 개발자가 봐도 공통된 부분은 도움이 될 것 같다. JAVA 버전도 나오면 좋겠다는 작은 기대를 해본다.

"발적화"에 능통했던 학생 개발자 시절

 

최적화의 개념을 처음 접했던 것은 대학 시절 "소프트웨어 공학" 강의 시간이었습니다. 이론 중심적인 강의였기 때문에 최적화를 실무 환경에서 고객의 요구를 충족하고 비용을 줄이기 위해 소프트웨어 개발 프로세스의 후반부에 수행하는 과정 중의 하나라고 인식하는 정도에 그쳤던 것 같습니다. 프로그래밍 과제나 학기 단위 프로젝트에 최적화 기법을 적용하는 것은 전적으로 개인의 역량이었고 교수님의 평가 기준에 속한 것도 아니었습니다. 저는 게으른 학생인 편이었기 때문에 반복문 내부에서 같은 함수의 호출이 반복적으로 일어나는 것 정도를 수정하는 "발적화" 수준에 머물렀고 전후 성능을 측정하여 비교하는 섬세함을 발휘하지도 않았습니다.

 

그다지 중요하게 여기지 않던 최적화의 필요성을 느낀 것은 "임베디드 프로그래밍" 강의를 수강하며 라인 트레이서를 구현하는 프로젝트를 진행할 때였습니다. 집이나 실습실의 PC에 비하면 아주 협소한 하드웨어에 모든 요구 사항을 구겨 넣기 위해서는 코드 최적화가 필수였습니다. 소스 파일의 용량을 조금이라도 줄이고 메모리를 효율적으로 사용하기 위해 밤을 새우며 고민하던 체력과 열정은 지금 어디로 간 것일까요?

 

임베디드 C++ 개발자의 경험을 "노련하게 풀어낸 책"

 

이 책의 저자는 임베디드 C++ 개발자 경력을 가지고 있습니다. 성능 향상을 위한 입증된 테크닉을 소개하며 실제 경험을 기반으로 소프트웨어 성능과 관련된 문제들을 언급합니다. 챕터의 소제목을 포함하여 기술 지식을 맛있게 포장해 놓은 흔적을 많이 발견할 수 있습니다. 적게는 수 배에서 많게는 수백 배의 성능 개선이 이루어지는 최적화 기법을 흑마술에 비유한 것은 적절한 표현이라고 생각합니다. 이 책은 최적화라는 무거운 컨셉과는 달리 생각보다 쉽고 즐겁게 읽을 수 있습니다. 뒤집어 생각하면 이 책은 접근하기 쉬운 방식으로 최적화를 간단하게 소개하는 수준에 그칩니다. 나쁜 책이라고 할 수는 없지만 제시된 예제와 최적화 기법은 딱히 새로운 것이 없고 단순합니다. 특히 자료구조 최적화를 다룬 10장은 C++ 기본서에서 볼 수 있는 지식을 나열해 놓은 것에 불과합니다. 이를 저자로서의 노련함이라고 포장해야 할까요?

 

20190810_155220.jpg



"가볍게" 읽을 수 있는 최적화 입문서

 

개인적으로 최적화는 OOP와 STL을 학습한 후 디자인 패턴을 다루기 전에 학습하기 좋은 주제라고 생각합니다. 다만 이 책을 전적으로 의지하여 최적화를 학습하기에는 부족한 요소가 많습니다. 이 책의 절반가량은 C++의 기능을 설명하며 나머지 부분도 C++을 깊게 이해하고 있는 분이라면 이미 알 법한 내용입니다. 즉, C++ 프로젝트 경험이 많고 STL을 잘 이해하고 있는 분에게는 새로운 것이 없는 내용으로 구성된 책입니다. 최적화와 전혀 관련 없는 내용을 다루는 것은 아니지만 정확성이 떨어지고 뭔가 많이 빠진 느낌입니다. 바이블 수준의 기본서를 학습한 후 STL의 동작을 추가로 학습하고 싶고 최적화에 간단히 입문하고 싶은 분이라면 추천할만한 책입니다. 하지만 현실적으로 C++ 기본서를 마스터했더라도 최적화라는 주제에 관심을 두기에는 이른 단계이지 않을까요? 어쨌든 왜 최적화를 해야 하며 최적화의 핵심이 무엇인가에 대한 정답만큼은 확실하게 제시하는 책입니다.

 

20190810_155512.jpg

 



최근에는 주로 C#과 JAVA 프로그램 언어를 쓰고 있으나, 게임 개발 또는 성능 개선이 필요한 곳에는 C++을 쓰곤 한다. 과거 어셈블리나 C를 썼던 것과 같이 요즘은 C++이 대신하는 언어가 되어 버렸다. 유니티가 C#을 지원하고 있으나, 게임 관련 각종 엔진은 C++로 제작된 경우가 많다는 것도 다들 잘 알고 있는 사실일 것이다. 실제 주변을 봐도 

내가 아는 개발자 친구도 빠른 처리가 필요한 증권사 프로그램에 필요한 각종 라이브러리는 C++로 제작하고 있다.


그만큼 C++은 어떤 프레임워크에 기초가 되는 하부 구성으로 효율성과 속도가 무척 중요한 부분에 많이 사용되는데, 최적화는 이런 프로그램 개발에 있어 모든 곳에서 다뤄져야 할 아주 중요한 사항이다.


그런데, 최적화는 단순히 몇 가지 기술만 안다고 되는 문제가 아니다. 최적화는 프로그램 전반에서 이뤄져야 하는 만큼, 다양한 측면을 바라보고, 코딩 라인마다 습관처럼 적용해야 한다. 그러다 보니 최적화 기술을 익히는 것은 쉽지가 않다. 또한 최적화는 코드 테스트와 같이 많은 시행착오를 거친 경험적 측면을 필요로 하는데, 업무 속도나 개발 일정만 따지는 환경에서 최적화 노하우를 축적한다는 것은 거의 불가능하다. 게다가 최적화를 다룬 책 또한 많지가 않다는 점에서 여러 가지로 난관이 많은 것이 프로그래밍의 최적화인 것이다.

 

그래도 다행인 것은 'C++ 최적화'와 같은 책이 있다는 것이다. 많지 않은 최적화 책 중에서 좀 더 다양한 것들을 익힐 수 있는 좋은 책으로 최적화의 의미부터 시작해서, 하드웨어에서의 최적화, 성능 측정, 문자열, 알고리즘, 동적 할당 변수, 문장 최적화, 라이브러리, 검색 및 정렬, 자료구조, 입출력, 동시성, 메모리 관리와 같이 개발 전반에 필요한 파트별 최적화 내용을 다루고 있다.

이 책은 C++11을 기준으로 설명하고 있으나, 지금의 C++17 릴리즈에도 적용되는 내용들이다. 


책 초반을 보면, 최적화에 대한 여러 고민을 얘기하고 있다. 최적화 무의미론도 살펴보고 있다. 책에 나온 거와같이 노력 대비 최적화로 얻을 수 있는 이득이 그리 크지 않다는 주장도 많은데, 항상 일정이 부족한 개발 현장에서는 일리가 있는 소리다. 어차피 개발 현장에서는 애자일 방법론이고, 패턴이고, 뭐고, 일정이 최고의 과제이기 때문이다. 그러나 일정에 맞춰 돌기만 하면 된다는 현장에서도 일이 어느 정도 마무리가 되면, 개발자 입장에서는 미치고 환장하게도 효율 개선과 속도 향상을 요구하곤 한다. 어쨌든 이런 요구에 현명하게 대응하기 위해서라도 최소 최적화에 대해 기본적인 지식은 알고 있어야 한다 생각한다.

 

[포맷변환]S600IMG_5879.png

 

프로그래밍을 하다 보면, 어떤 기능을 구현하는데, 방법이 여러 가지가 있는 경우를 많이 접하게 된다.  어떤 것을 사용하는 것이 옳은 방법인지 한참 고민에 빠지기도 한다. 책에는 그러한 경우에 대한 명확한 답을 제시한다. 필자가 실제 테스트해보고, 어떤 것이 효율적인지, 어떤 것이 더 빠르게 연산하는지, 확실한 답을 해주는 것이다.

예를 들어, std::thread와 std::async 경우도 그러하다. 프로그램에서 둘 다 동일한 기능을 구현할 수 있다. 그런데 저자는 std::async를 쓰라고 한다. 스레드는 직간접 비용이 많이 든다는 것이다. 메모리 양의 증가와 지연 또는 스래싱 등의 문제를 유발할 수 있다고 한다. std::vector와 std::array도 비슷하다. 꼭 필요하지 않는 한, 동일하게 구현이 가능하다면, std::array를 사용하라고 한다.

 

[포맷변환]S600IMG_5881.png

 

이렇게 'C++ 최적화'에서는 써야 할 것과 쓰지 말아야 할 것, 확인이 필요한 것 또는 염두에 둬야 할 사항들을 잘 정리해서 알려 주고 있다. 그렇기에 이 책은 개발자가 많은 시행착오를 겪어 가며, 동일한 문제로 쓸데없이 시간 낭비를 하지 않게 해준다. 바쁜 개발 일정 속에서도 최적화된 코드를 작성할 수 있게 돕는 것이다. 그리고 최소 여러 이유로 당장은 최적화된 코드를 작성하지 못하더라도, 나중에 어디를 고쳐야 할지 방향을 알 수 있게 해준다.

 

'C++ 최적화'가 여러모로 개발자의 스킬과 시각을 넓히는데 도움을 주는데, 다만 책 주제 자체가 프로그래밍의 깊은 곳을 건드리고 있는 만큼, 결코 쉬운 수준의 책이 아니라는 점이 아쉽다. 2장만 해도 컴퓨터 하드웨어 메커니즘에 대한 이해가 어느 정도 되어 있어야 이해가 빠르며, 이와 함께 C++ 문법을 전체적으로 잘 파악하고 있거나, 실제 여러 코딩 경험이 있는 개발자에게 어울리는 수준의 책이다. 그러나 이해하고 못하고는 개인마다 다른 것이고, 책 설명이 아주 난해한 정도는 아니므로, 자신이 이해 가능한 부분부터 보는 것도 나쁘지 않을 것이다.


책을 보는 내내, 부분별로 내가 짰던 코드를 떠올려 봤다. 어디를 개선해야 할지, 다시 생각했다. 이렇게 하다 보면, 최적화된 코딩 습관도 저절로 몸에 붙을 것이다. 레벨업을 위해 앞으로도 계속 'C++ 최적화'를 참고할 생각이다.

자신의 프로그래밍 능력을 한 단계 업그레이드하고 싶은 분이라면, 'C++ 최적화'가 큰 도움이 되어 줄 것이라 생각한다. 



[한줄평]

리팩토링과 클린 코드를 지향하는 사람이라면 좋은 지침서로서 추천 합니다.


[목차구성]

이책은 총 chapter13으로 구성되어 있습니다.


CHAPTER 1 최적화란

CHAPTER 2 컴퓨터 하드웨어와 최적화

CHAPTER 3 성능 측정

CHAPTER 4 문자열 최적화

CHAPTER 5 알고리즘 최적화

CHAPTER 6 동적 할당 변수 최적화

CHAPTER 7 문장 최적화

CHAPTER 8 라이브러리 최적화

CHAPTER 9 검색 및 정렬 최적화

CHAPTER 10 자료구조 최적화

CHAPTER 11 입출력 최적화

CHAPTER 12 동시성 최적화

CHAPTER 13 메모리 관리 최적화


[이 책의 주요 특징]

  1. 성능에 영향을 주는 컴퓨터 하드웨어 기본 지식

  2. 프로파일러와 소프트웨어 타이머를 활용한 측정 기법

  3. 최신 C++에서 문자열의 기능을 최적으로 조합하는 방법

  4. 비효율적인 알고리즘을 개선하고 C++ 코드의 행동 패턴을 참조해 최적화하는 방법

  5. 동적 할당 변수를 제대로 사용하고 메모리 관리자의 호출 횟수를 줄이는 방법

  6. 실행에 불필요한 명령어를 제거하여 문장 수준에서 최적화를 이루는 방법

  7. 처음부터 고성능을 목표로 하는 라이브러리를 설계하는 방법

  8. C++ 컨테이너 클래스의 장점과 단점을 이해하고 활용하는 방법

  9. C++ 스트리밍 입출력 함수를 효율적으로 사용하는 방법

  10. 그 외 성능 저하를 일으키는 요인을 찾아내고 수정하는 방법


[이 책의 독자 대상]

  • C++ 프로그램 실무는 보는 사람

  • 다른언어의 개발자 중 프로그래밍 리팩토링과 최적화에 관심이 많은 사람


[서평]


C++은 자동화와 표현력부터 성능 향상을 위한 세밀한 제어까지 다양한 기능 구현 옵션을 제공합니다.  바로 이러한 폭넓은 선택 가능성 덕분에 성능 요구 사항을 충족하기 위해 C++ 프로그램을 향상할 수 있습니다.


C++에는 함수 호출, 메모리 할당, 루프등 최저고하 대상이 되는 ‘유력 용의자’들이 있습니다. 최적화 조언은 쉽고 간단하게 설명합니다. 대부분 기존에 어딘가에서 발표된 내용들입니다.


이 책은 개발자가 최적화 기회를 알아보고 최대한 잘 활용하여 코드 성능을 향상하는데 도움이 될 것입니다.


다음은 최적화에 대해서 배울 내용들을 요약한것입니다.

  • 더 좋은 컴파일러를 사용하고 최적화 설정을 사용하세요.

  • 최적의 알고리즘을 사용하세요.

  • 더 좋은 라이브러리를 더 잘 사용하세요.

  • 메모리 할당을 줄이세요.

  • 복사를 줄이세요.

  • 계산을 제거하세요.

  • 최적의 자료구조를 사용하세요.

  • 동시성을 증가시키세요.

  • 메모리 관리를 최적화하세요.


이 책을 읽고 예제를 이해하기 위해서는 C++의 어느 정도 문법적 지식과 동작원리를 잘 알고 있어야 한다. 그리고 모던 C++ 11과 같은 문법도 이용하여 설명 하고 있어 최신 문법도 알고 있으면 이해하는데 도움이 된다. 이책은 C++의 입문서가 아니라 초급에서 중급으로 넘어가는 책이다. C++ 실무에서 3-5년차 정도가 보면 많은 도움이 될것이라 생각합니다. 그리고 리팩토링과 클린 코드를 지향하는 사람이라면 좋은 지침서로서 추천 합니다.



c++.jpg

 

 

 

올해 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++코드를 최적화 하는 방안들에 대해서 알려준다. 어느 최적화와도 마찬가지로 

 

기초자에게는 쉽지 않다.

20190808_222136 (1).jpg

 

Screen Shot 2019-08-08 at 9.38.32 PM.png

 

 

 

C++ 을 사용한지는 꽤 되었으나 사실 최적화라는 과정을 많이 거치진 않았습니다.

 

기능 구현하기에 급급해서 성능을 생각하지 않고 막코딩을 하기 일수였죠.

 

이 책을 보면서 최적화에 대한 필요성과 효율성을 다시 한번 깨닫게 되었습니다.

 

단순 소프트웨어 제어 뿐만 아니라 하드웨어 설계 까지 고려한 최적화를 깊이 있게 설명하고있습니다.

 

이 책은 C++에 어느정도 익숙하고 c++로 프로그램을 작성해본 사람을 대상으로 합니다.

 

C++ 기본서로는 추천하지 않으며, 리팩토링이나 최적화에 관심있는 분께 추천합니다.

 

 

  리뷰에 앞서 본 리뷰는 한빛 출판 네트워크에서 진행한 ‘나는 리뷰어다’ 이벤트에서 제공받은 책으로 진행한 것을 밝힙니다.

 

B8975427001_l.jpg

 

  보통 프로그램을 작성할 때, 어떤 프로그램 언어를 이용해 목적하는 기능을 어떻게 구현하는 것에 대해 신경을 쓴다. 동작 시간과 관련한 요구사항이 특별히 없다면 프로그램이 원하는 대로 동작하면 거기서 프로그램 작성은 완료일 것이다. 하지만, 상업용으로 사용되는 프로그램의 경우 시간에 대한 요구사항은 항상 포함된다. 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++ 초보자를 위한 책은 아니지만, 최적화를 고려하는 최적화 초보자 분들께는 좋은 지침서가 될 것으로 생각된다.

 

IMG_4250.jpeg

 

이책은 자잘한 팁을 통한 최적화를 말하지 않는다.

시스템의 동작원리를 설명하고, C++ 언어 자체가 내부적으로 수행하는 모습을 모여주며

std 라이브러리의 내부 구현을 설명한다.

이런 원리를 이해한후, 그다음 저자가 제시하는 최적화 방안을 보면 쉽게 수긍이 된다.

그런데, 이 원리를 이해한다는 것이 내용에 따라 조금 버거울수도 있다. 그렇다고

무작정 처방의 이유를 모르고 처방전만 내 코드에 적용한다면 큰 도움이 되지 못할 것이다.

 

이 책을 통해서 왜 이러한 처방전이 나오게되었는지 꼭 이해하기를 바란다.

쉽게 지나칠 수 있는 스트링 다루기, 메모리 할당, 루프의 효율적 사용, 라이브러리 설계 등

전반적인 내용에 대해 충실히 담고 있다.

 

추천!

 

좀더 자세한 리뷰는...

https://medium.com/@choijunghyun/%EB%A6%AC%EB%B7%B0-optimized-c-7f7943439423

다양한 방면에서 아주 소중한 우리 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++ 최적화 (Optimized C++)

지은이

  • 지음 : 커트 건서로스
  • 옮김 : 옥찬호
  • 감수 : 박수현

링크

https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=195439191

출판사

한빛미디어

카테고리

개발, IT, 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 10 자료구조 최적화
__10.1 표준 라이브러리 컨테이너 알아보기
__10.2 std::vector와 std::string
__10.3 std::deque
__10.4 std::list
__10.5 std::forward_list
__10.6 std::map과 std::multimap
__10.7 std::set과 std::multiset
__10.8 std::unordered_map과 std::unordered_multimap
__10.9 다른 자료구조
__10.10 마치며

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++관련 효율화 부분을 틈나는 대로 더 자세히 읽어봐야겠습니다.

 

1.jpg

< C++ 최적화, Optimized C++, 한빛미디어 >

 

 

한빛미디어에서 새로 출간한 C++ 최적화 도서다.

최적화의 필요성, 역사와 C++ 최적화의 베스트 프랙티스들을 다양한 주제로 제공합니다.

 

최적화를 할 때 기능 구현을 우선으로 하고 최적화를 진행하기도 하지만,

처음 기능을 구현할 때 조금만 신경 써서 베스트 프랙티스대로 코딩한다면, 별다른 최적화 투입 시간 없이 성능 저하를 미리 막을 수 있다는 점이 저자의 생각이다.

 

C++ 의 다양한 기능을 소개하고 장단점과 어떻게 하면 성능 저하를 막고 최적화를 할 수 있는지 서술한다. C++ 뿐 아니라 다른 언어에서도 충분히 적용할 수 있는 다양한 베스트 프랙티스를 제공한다.

 

 

2.jpg

< C++ 최적화 3장 성능 측정, 한빛미디어 >

 

 

초반부에는 최적화 소개와 하드웨어 배경, 최적화 관련 역사들을 소개한다.

3장은 성능 측정 단원으로 시간 측정을 메인 주제로 설명한다.

시간 측정은 어떤 원리로 하고, 하드웨어가 발전함에 따라

시간 측정 방법이 어떻게 변화되고 그 성능이 얼마나 좋아졌는지 상세히 설명한다.

 

시간 측정은 중요한 성능 지표이므로 반드시 읽어보면 좋을 내용이다.

따로 포스팅하고 싶을 정도로 도움이 많이 되었다.

 

 

3.jpg

 

 

4장부터 C++ 코드가 등장하기 시작하며 문자열 최적화 단원이 시작된다.

문자열에 관한 초보 개발자들의 많은 오해들을 해소시켜주고 문자열의 동작 원리를 낱낱이 파헤쳐줍니다. 자연스레 문자열을 어떻게 하면 최적화하는지 따라갈 수 있습니다.

 

 

4.jpg

 

5.jpg

 

6장은 동적 할당에 관한 베스트 프랙티스를 제공한다.

기존 C++ 에서 동적 메모리와 관련된 new, delete 를 소개하고

C++에 도입된 std::unique_ptr, std::make_shared 등 스마트 포인터들을 소개한다.

스마트 포인터들로 어떻게 메모리 누수를 막고 효율적으로 관리하는지 알려주어

많은 도움이 됐습니다.

 

 

6.jpg

 

7.jpg

 

8.jpg

 

그 다음에는 자료구조, 알고리즘 최적화를 소개합니다.

C++ 컨테이너 클래스로 자료구조를 쉽게 다룰 수 있지만, 기본적인

자료구조 이론과 C++로 구현된 자료구조 스펙들을 모른다면

어디서부터 최적화를 할 지 모릅니다.

 

어떤 상황일 때 어떤 자료구조와 알고리즘을 최적화하면 좋은지 자세하게 설명해 많은 도움이 됩니다.

 

후반부 12장에는 동시성(Concurrency)에 관련된 내용들을 소개하고

동시성이 운영체제와 하드웨어 단에서 어떻게 동적되고

C++ 클래스가 어떻게 동작되어 베스트 프랙티스가 무엇인지

알 수 있습니다.

 

책 구성 전체적으로 C++로 코딩할 때 흔히 직면하는 최적화 문제를 다루고 있다.

C++ 개발자들에게 좋은 베스트 프랙티스들을 제공하고 여러 동작 원리들을 소개하여

하드웨어와 소프트웨어 지식, 두 마리의 토끼를 모두 잡아준다.

 

책장에 늘 있어야 할 좋은 레퍼런스 책이었다.


출처: https://itchipmunk.tistory.com/406 [다람쥐의 일상]

결제하기
• 문화비 소득공제 가능
• 배송료 : 2,000원배송료란?

배송료 안내

  • 20,000원 이상 구매시 도서 배송 무료
  • 브론즈, 실버, 골드회원이 주문하신 경우 무료배송

무료배송 상품을 포함하여 주문하신 경우에는 구매금액에 관계없이 무료로 배송해 드립니다.

닫기

리뷰쓰기

닫기
* 상품명 :
C++ 최적화 : 최고 성능을 구현하는 10가지 검증된 기법
* 제목 :
* 별점평가
* 내용 :

* 리뷰 작성시 유의사항

글이나 이미지/사진 저작권 등 다른 사람의 권리를 침해하거나 명예를 훼손하는 게시물은 이용약관 및 관련법률에 의해 제재를 받을 수 있습니다.

1. 특히 뉴스/언론사 기사를 전문 또는 부분적으로 '허락없이' 갖고 와서는 안됩니다 (출처를 밝히는 경우에도 안됨).
2. 저작권자의 허락을 받지 않은 콘텐츠의 무단 사용은 저작권자의 권리를 침해하는 행위로, 이에 대한 법적 책임을 지게 될 수 있습니다.

오탈자 등록

닫기
* 도서명 :
C++ 최적화 : 최고 성능을 구현하는 10가지 검증된 기법
* 구분 :
* 상품 버전
종이책 PDF ePub
* 페이지 :
* 위치정보 :
* 내용 :

도서 인증

닫기
도서명*
C++ 최적화 : 최고 성능을 구현하는 10가지 검증된 기법
구입처*
구입일*
부가기호*
부가기호 안내

* 온라인 또는 오프라인 서점에서 구입한 도서를 인증하면 마일리지 500점을 드립니다.

* 도서인증은 일 3권, 월 10권, 년 50권으로 제한되며 절판도서, eBook 등 일부 도서는 인증이 제한됩니다.

* 구입하지 않고, 허위로 도서 인증을 한 것으로 판단되면 웹사이트 이용이 제한될 수 있습니다.

닫기

해당 상품을 장바구니에 담았습니다.이미 장바구니에 추가된 상품입니다.
장바구니로 이동하시겠습니까?

자료실

최근 본 상품1