C/C++에서 가독성을 희생하는 최적화는 의미없더라

피보나찌 수열의 합을 구하는 포스팅에 JAFO님께서 쓰신 답글에 제목과 같은 내용의 글이 올라왔다.
사실 이 얘기는 컴파일러의 입장에서 생각해보면 어쩌면 당연한 얘기다. 아님 말고.

아무튼, 이 뻔해보이는 내용을 컴파일러에서 어셈블리 코드로 뽑아서 확인해봤다. (Visual C++ 2003.Net 사용)
전투에 사용된 코드는 아래의 두 선수들.

  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;
  }



  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);
  }

다.

컴파일 된 결과는 각각 아래와 같다. (소스에서 색칠한 부분의 컴파일 결과만 발췌)


; 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



; 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%도 없으니, 혼자 만들고 읽을 코드가 아니라면 적절한 가독성을 갖도록 작성하는 것이 상책이다.

Trackback 0 Comment 12
  1. Favicon of http://oneniner.net BlogIcon oneniner 2009.09.10 09:03 address edit & delete reply

    ㅎㅎ 갑자기 그런 일을...
    어이하야 갑자기 그런 생각을~ ㅋㅋㅋ

    • Favicon of http://zockr.tistory.com BlogIcon BLUEnLIVE 2009.09.10 09:50 address edit & delete

      며칠간 좀 고민하고 토론했던 주제인데, 이제 결론낸 거쥐...

  2. Favicon of http://minimonk.tistory.com BlogIcon 구차니 2009.09.10 10:11 address edit & delete reply

    가독성은 중요하죠 ㅋㅋ

    • Favicon of http://zockr.tistory.com BlogIcon BLUEnLIVE 2009.09.10 11:03 address edit & delete

      이리저리 돌아서 적었지만, 사실은 컴파일러 입장에서의 readability보단 인간 입장에서의 readability가 훨씬 중요하죠.

  3. Favicon of http://clansim.tistory.com BlogIcon clansim 2009.09.10 10:24 address edit & delete reply

    요즘은 컴파일러가 좋아서 왠만하면 알아서 다 최적화를 해주니 되도록 읽기 쉽도록 쓰는게 좋지요^^

    • Favicon of http://zockr.tistory.com BlogIcon BLUEnLIVE 2009.09.10 11:03 address edit & delete

      그럼요. 당연하죠. ^^

  4. JAFO 2009.09.10 11:55 address edit & delete reply

    아~~~ 까마득히 오래전일 부끄부끄 [emo=103]

    • Favicon of http://zockr.tistory.com BlogIcon BLUEnLIVE 2009.09.10 20:18 address edit & delete

      좋은 답글 다시 한 번 감사드립니다.

  5. Favicon of http://ujuc.kr BlogIcon 사진우주 2009.09.10 15:07 address edit & delete reply

    하는일은 동일하네요.ㅡ.ㅡ...

    그냥 보기 좋게 만드는게.ㅡ.ㅡ... 편하겠어요~~ ㅋㅋㅋ.ㅡ.ㅡ... 은근히 따라하기중이라^^.;[emo=100]

    • Favicon of http://zockr.tistory.com BlogIcon BLUEnLIVE 2009.09.10 20:19 address edit & delete

      역시 최적화는 알고리즘 자체를 최적화하는 것이 정석입니다!

  6. Favicon of http://cdmanii.com BlogIcon cdmanii 2009.09.10 16:52 address edit & delete reply

    아래것이 빠를줄알았는데.. 똑같다니.. 자신이 보기 편하게 만들어야겠네요 ㅎ

    • Favicon of http://zockr.tistory.com BlogIcon BLUEnLIVE 2009.09.10 20:19 address edit & delete

      자신이 보기에도, 다른 사람이 보기에도 편한 코드가 좋은 코드인 것 같습니다.
      최적화는 컴파일러가 알아서 해줘야죠... ^^