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

한빛미디어

독자리뷰

c++ 최적화 후기

melllo***

|

2019-08-07

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

빠른 코드를 작성하는 시간은 느린 코드를 작성하는 시간보다 결코 길지 않다. 이 책은 올바른 코드를 구현하면서도 빠른 C++ 프로그램을 만드는 최적화 방법을 소개한다. 습관적으로 쓰는 C++ 구문을 점검해보고 싶다면 35년 경력의 저자가 소개하는 10가지 기법으로 시작해보자.

  • 저자 : 커트 건서로스
  • 번역 : 옥찬호
  • 출간 : 2019-07-05
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++관련 효율화 부분을 틈나는 대로 더 자세히 읽어봐야겠습니다.

닫기

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