2019년 12월 17일 화요일

전위 증감 연산자(++i 와 i++)의 차이점

for 루프를 사용하다보면 자주 사용하게 되는 변수 i
이 i 변수에 1을 더하는 i++와 ++i는 서로 차이가 있다.
결론부터 말하면 ++i가 더 성능이 좋다고 할 수 있다.


Ex Code )

#include <stdio.h>
#include <time.h>

double be_test() {    
    clock_t start, end;
    int i,j;
    int sum = 0;
    start = clock(); //시간 측정 시작
    
    for (i = 0; i < 100000; ++i) {
        for (j = 0; j < 10000; ++j) {
            sum += i * j;
        }
    }
    end = clock(); //시간 측정 끝
    return (double)(end - start);
}


double af_test() {    
    clock_t start, end;
    int i,j;
    int sum = 0;
    start = clock(); //시간 측정 시작
    
    for (i = 0; i < 100000; i++) {
        for (j = 0; j < 10000; j++) {
            sum += i * j;
        }
    }
    end = clock(); //시간 측정 끝
    return (double)(end - start);

}

int main() {

    printf("전위 증감 연산 시간: %f", bf_test()); //결과 출력
printf("후위 증감 연산 시간: %f", af_test()); //결과 출력 return 0;
}

결과)


"전위 증감 연산 시간 : 22.000000"  (5번 정도 실행해본 결과 22초~ 23초)
"후위 증감 연산 시간 : 24.000000"  (5번 정도 실행해본 결과 24초~ 25초)


++i  :  내부적으로 다음과 같이 동작한다.

1. i의 값을 1 더한다.
2. i의 값을 반환한다.


i++ :  내부적으로 다음과 같이 동작한다.

1. i의 현재 값을 보관한다. (현재 실행되는 명령문에서는 이 보관된 값이 사용되어야 하니까)
2. i의 값을 1 더한다.
3. 보관했던 값을 반환한다.


2동작을 수행하는 것과 3동작을 수행하는 것(i++은 ++i에 보관하는 과정이 추가된 것이므로)은 많은 경우 성능 차이를 가져온다.

i++와 ++i는 현재 행에서 사용되는 값이 원래의 값을 사용하는가 1이 더해진 값을 사용하는가의 차이도 존재하지만
for(i = 0; i < 10; i++)에서와 같이 단독으로도 충분히 사용된다. 이러한 경우 i++보다는 ++i를 사용하는 것이 성능상 더 좋다고 할 수 있다.

물론, 똑똑한 컴파일러는 최적화를 수행해준다. i++로 코드를 작성했다고 하더라도 실행에 영향이 없는 내용은 ++i로 바꿔서 컴파일한다.

하지만! C++에서 연산자 오버로딩을 해서 전위, 후위 ++연산자를 직접 만든 경우에는 컴파일러가 최적화를 수행해 줄 수 없다.
때문에 이 경우 성능차이가 나게된다.
마찬가지로 C++ STL에서 vector, list 등을 사용할때 iterator를 전위 ++ 연산자로 증가시키면 성능상의 이점을 기대할 수 있다.

출처: https://iwantadmin.tistory.com/114 [실수로포스팅해버렸다.]