티스토리 뷰
register int 와 int 의 수행속도 차이 비교
C언어든 C++이든 결국 컴파일러를 거치면 어셈블리로 전환이 될 것입니다. 이는 곧 기계어이며 하드웨어와 연관이 있는 언어이므로, 하드웨어와 관련있는 코딩 구문들도 상당수 존재합니다.
그 중 register int 에 대해 확인 해 보도록 하겠습니다.
int main() {
int tmp1 = 0;
int tmp2 = 0;
clock_t clk1 = clock();
for (int i = 0; i < 10000; i++) {
for (int j = 0; j < 10000; j++) {
tmp1 += i;
}
}
cout << "1: " << clock() - clk1 << "ms" << endl;
clock_t clk2 = clock();
for (register int i = 0; i < 10000; i++) {
for (register int j = 0; j < 10000; j++) {
tmp2 += i;
}
}
cout << "2: " << clock() - clk2 << "ms" << endl;
}
int 를 사용한 첫번째 테스트 결과와 register int 를 사용한 두번째 테스트 결과는 !?
최적화 옵션 없이 컴파일하여 속도를 측정해보면 아래와 같은 결과가 나옵니다.
기본 for문을 10,000,000 회 수행하였을때 2번이 14ms 만큼 더 빠른 것을 알 수 있습니다. 최적화 성능이 요구되는 알고리즘 시험 등에서는 유용하게 쓰일 수 있을 것 같습니다.
이런 결과가 나오는 것을 추측해보건데 CPU에 있는 register에 해당하는 변수를 우선적으로 배치함으로써 이런 성능차이가 벌어지지 않았나 싶습니다. 즉, 무작정 큰 배열을 register int a[10000]과 같은 식으로 해보았자 전혀 의미가 없겠죠.
CPU의 레지스터 숫자는 굉장히 한정적이니까요. 컴파일러에게 무조건 register를 붙여준다고 해서 레지스터를 사용하지는 못할 것입니다. 그렇다고 할지라도 우선적으로 배치해라라는 명령어 정도는 내릴 수 있을 것이고 이것의 역할을 하는 것이 register인 것입니다. 이 상황에 가장 적합한 것이 매 loop마다 계속해서 값이 바뀌고 참고해야하는 for문의 변수인 것이죠. (물론 눈치빠른 컴파일러는, 특히 최적화 옵션을 키면 아마 바로 이 부분의 최적화에 들어갈 것입니다만)
'Computer > C' 카테고리의 다른 글
[c/c++] 문자열 NULL , 0, '\0' 차이 및 개념 (0) | 2021.11.01 |
---|---|
[초급] 문자열비교 (0) | 2017.07.04 |
[초급] 문자열입력받기 (0) | 2017.07.04 |
[초급] 문자열 입력받고 하나씩 자르기 (3) | 2016.04.09 |
함수포인터 & 멤버함수 포인터 관련 (0) | 2015.09.02 |