티스토리 뷰

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문의 변수인 것이죠. (물론 눈치빠른 컴파일러는, 특히 최적화 옵션을 키면 아마 바로 이 부분의 최적화에 들어갈 것입니다만)

댓글

파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음



Total
Today
Yesterday
최근에 달린 댓글