C/C++ 성능 최적화

2019. 5. 17. 21:57C++

여기서 DT = DataType의 줄임말로 사용,

A < B는 속도로 비교하기 때문에 A가 B보다 빠름을 의미.

 

1. (++i) vs (i++)

(* for문에서만 둘의 차이가 없으며, 때로는 컴파일러가 자동으로 최적화를 해줄 수 있음.)

(++i)는 i에 1을 더하고, 더한 값을 사용하기에 그냥 (+= 1)과 같지만,

(i++)같은 경우, 변수를 만들고 i의 값을 먼저 저장, 그리고 i에 (+=1)을 해주고, 방금전에 만든 변수를 사용한다.

 

(++i) < (i++)

 

2. func(const DT) vs func(const DT *) vs func(const DT &)

매개변수로 값을 그냥 사용하는 경우,

함수를 부를 때 값을 복사하기 때문에 매우 느리다.

포인터나 참조의 경우, 둘 다 변수의 주소를 복사해서 보내는 식으로 속도는 같다고 한다.

(* 어셈블리어로 분해해본 결과도 있는데, 차이가 없다고 함)

하지만 만약에 변수가 변수의 주소 값보다 크지 않을 경우,

이는 차이가 없거나 오히려 악영향을 끼칠 수 있다.

(ex 

char = 1byte, 32bit-arch -> (char *) = 4byte | 64bit-arch -> (char *) = 8byte

int = 4byte, 32bit-arch -> (int *) = 4byte | 64bit-arch -> (int *) = 8byte

func(const DT) < func(const DT *) = func(const DT &) )

 

일반적으로는

func(const DT) > func(const DT *) = func(const DT &)

 

3. DT i vs const DT i

(* REF: https://godbolt.org/g/UEX4NB,

https://www.ikpil.com/820)

위의 어셈블리어로 분해된 코드를 보면,

일반 변수는 메모리에 접근을 하여 복사하는 코드가 보이지만,

상수는 그냥 값을 복사한다.

메모리 접근 + 복사 > 복사

 

DT i > const DT i

 

4. unsigned i vs signed i

(1) unsigned (int)변수는 signed (int)변수보다 2의 제곱으로 나누는 경우에 빠르다.

이는 부호가 있을 때, 나누고 0으로 반올림하기에 많은 작업이 더 들어가기 때문이다.

(2) 상수로 나눌 경우

-

(3) 짝수인지 비교할 때.

이것도 (1)과 같은 이유이기 때문일 것이다.

(* REF: https://stackoverflow.com/questions/4712315/performance-of-unsigned-vs-signed-integers)

 

5. char vs short vs int

(* REF: https://copynull.tistory.com/112)

char = 1byte,

short = 2byte,

int = 4byte(32bit-arch).

일반적으로 CPU는 4byte에 최적화돼있기 때문에,

char, short보단 int가 오히려 빠르다.

하지만, 64비트에서는 큰 차이가 없는 것으로 나타난다(char < short < int).

 

int < char < short

 

+

스왑 알고리즘

REF: http://hisjournal.net/blog/125

 

+

최적화 팁 모음

REF: https://copynull.tistory.com/119

'C++' 카테고리의 다른 글

C++ 메모리의 모든 것  (0) 2020.03.01
fatal error: 'include/****.h' file not found  (0) 2019.07.22
CEF(Chromium Embedded Framework)  (0) 2019.07.14
C++ 현재 시간 가져오기  (0) 2019.06.08
VSCode C++ Debugging Error  (0) 2019.04.27