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초) |
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를 전위 ++ 연산자로 증가시키면 성능상의 이점을 기대할 수 있다.