2019. 5. 17. 21:57ㆍC++
여기서 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,
위의 어셈블리어로 분해된 코드를 보면,
일반 변수는 메모리에 접근을 하여 복사하는 코드가 보이지만,
상수는 그냥 값을 복사한다.
메모리 접근 + 복사 > 복사
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
+
최적화 팁 모음
'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 |