- C/C++에서 가독성을 희생하는 최적화는 의미없더라
- 컴퓨터야그/컴퓨터 일반
- 2009. 9. 10. 02:00
피보나찌 수열의 합을 구하는 포스팅에 JAFO님께서 쓰신 답글에 제목과 같은 내용의 글이 올라왔다.
사실 이 얘기는 컴파일러의 입장에서 생각해보면 어쩌면 당연한 얘기다. 아님 말고.
아무튼, 이 뻔해보이는 내용을 컴파일러에서 어셈블리 코드로 뽑아서 확인해봤다. (Visual C++ 2003.Net 사용)
전투에 사용된 코드는 아래의 두 선수들.
랑
다.
컴파일 된 결과는 각각 아래와 같다. (소스에서 색칠한 부분의 컴파일 결과만 발췌)
와
다.
봐서 알 수 있듯이 똑같다.
마지막 3 행은 for() 루프의 마지막 부분이라 붙은 것인데, 이 내용까지 똑같다.
즉, 성능의 향상은 0.001%도 없으니, 혼자 만들고 읽을 코드가 아니라면 적절한 가독성을 갖도록 작성하는 것이 상책이다.
사실 이 얘기는 컴파일러의 입장에서 생각해보면 어쩌면 당연한 얘기다. 아님 말고.
아무튼, 이 뻔해보이는 내용을 컴파일러에서 어셈블리 코드로 뽑아서 확인해봤다. (Visual C++ 2003.Net 사용)
전투에 사용된 코드는 아래의 두 선수들.
1 2 3 4 5 6 7 8 9 10 11 | int f1=1, f2=2, f3=f1+f2; int iSum=0; while (f2<4000001) { iSum += f2; _tprintf(_T( "%d -> %d\n" ), f2, iSum); // 다음 3개의 항을 구함 f1 = f2 + f3; f2 = f1 + f3; f3 = f1 + f2; } |
랑
1 2 3 4 5 6 | int f1=1, f2=2, f3=f1+f2, iSum=0; while (f2<4000001) { _tprintf(_T( "%d -> %d\n" ), f2, iSum+=f2); f3 = f1 + (f2 = (f1 = f2 + f3) + f3); } |
다.
컴파일 된 결과는 각각 아래와 같다. (소스에서 색칠한 부분의 컴파일 결과만 발췌)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | ; 14 : // 다음 3개의 항을 구함 ; 15 : f1 = f2 + f3; lea eax , DWORD PTR [ edi + esi ] ; 16 : f2 = f1 + f3; lea esi , DWORD PTR [ edi + eax ] add esp , 12 ; 0000000cH cmp esi , 4000001 ; 003d0901H ; 17 : f3 = f1 + f2; lea edi , DWORD PTR [ esi + eax ] jl SHORT $L9627 pop edi pop esi |
와
1 2 3 4 5 6 7 8 9 10 | ; 12 : f3 = f1 + (f2 = (f1 = f2 + f3) + f3); lea eax , DWORD PTR [ edi + esi ] lea esi , DWORD PTR [ edi + eax ] add esp , 12 ; 0000000cH cmp esi , 4000001 ; 003d0901H lea edi , DWORD PTR [ esi + eax ] jl SHORT $L9627 pop edi pop esi |
다.
봐서 알 수 있듯이 똑같다.
마지막 3 행은 for() 루프의 마지막 부분이라 붙은 것인데, 이 내용까지 똑같다.
즉, 성능의 향상은 0.001%도 없으니, 혼자 만들고 읽을 코드가 아니라면 적절한 가독성을 갖도록 작성하는 것이 상책이다.
'컴퓨터야그 > 컴퓨터 일반' 카테고리의 다른 글
오늘은 구글 창립 11주년 기념일 (1) | 2009.09.28 |
---|---|
GMail의 외국어 화면들 (1) | 2009.09.25 |
Visual Studio 계열 쉬프트(>>) 연산 버그의 원인 (8) | 2009.09.06 |
에라토스테네스의 체가 과연 빠르긴 빠르네 (7) | 2009.09.06 |
도저히 이해할 수 없는 Visual C++ 6.0의 성능 (6) | 2009.09.05 |
Recent comment