Study/C#

For문과 Whie문의 속도차이

Houkibosi 2012. 8. 14. 00:04

for문과 while 문의 속도 비교

1.조건문이 있는 while과 for 문 비교

while

unsigned int i = -1, j = 0;

while(j < i)

{

++j;

}

코드의 해석

004114D0 mov dword ptr [i],0FFFFFFFFh // i를 42969..... 최대값으로 초기화

004114D7 mov dword ptr [j],0 // j를 0으로 초기화

004114DE mov eax,dword ptr [j] // j를 eax에 옮기고

004114E1 cmp eax,dword ptr [i] // i와 eax와 비교 하고

004114E4 jae main+51h (4114F1h) // while {} 진입

004114E6 mov eax,dword ptr [j] // j를 eax 옮기고

004114E9 add eax,1 // eax 를 1 증가

004114EC mov dword ptr [j],eax // eax를 j에 다시 갔다 놓고

 004114EF jmp main+3Eh (4114DEh) // 다시 004114DE 로 점프

반복 구문만 통계를 내면 mov 3번, cmp 1번, jae 1번 add 1번, jmp 1번

 

for

for(unsigned int i = -1, j = 0;j < i; ++j)

{

}

코드의 해석

004114D0  mov         dword ptr [i],0FFFFFFFFh     // i를 42969..... 최대값으로 초기화

004114D7  mov         dword ptr [j],0         // j를 0으로 초기화

004114DE  jmp         main+49h (4114E9h)         // for의 조건구역으로 이동 004114E9 여기

004114E0  mov         eax,dword ptr [j]         // j를 eax로 옮김

004114E3  add         eax,1             // eax에 1증가

004114E6  mov         dword ptr [j],eax         // eax를 j에 옮김

004114E9  mov         eax,dword ptr [j]         // j를 eax로 옮김

004114EC  cmp         eax,dword ptr [i]         // i와 비교함

004114EF  jae         main+53h (4114F3h)         // for {} 구역으로 진입

004114F1  jmp         main+40h (4114E0h)         // for 연산처리 구역으로 점프 004114E0  여기

반복 구문만 통계를 내면 mov 3번 cmp 1번 jae 1번, add 1번, jmp 1번

 

1-1. 조건문이 있는 for 과 while 차이

진행 순서만 다를 뿐, 차이는 없다. 그렇다면 왜 명서인 "C programing language"루프를 돌릴 때 for을 사용 하는 것일까?

2. 조건문이 없을 때

While

while(TRUE)

{

}

에샘블리어 해석

004114D0  mov         eax,1                        // eax에 1 이동

004114D5  test        eax,eax                        // test ??

004114D7  je          main+3Bh (4114DBh)        // while {} 진입

004114D9  jmp         main+30h (4114D0h)    // 비교 로 진입 004114D0

 

for

for(;;)

{

}

어샘블러 해석

004114D0  jmp         main+30h (4114D0h)    // for의 {} 안으로 진입

 

2-1 조건문이 없을 때, 차이점

무한 loop 에선 while보다 for문이 명령어 3개를 더 적게 사용 하기 때문에, for문이 더 빠르다. 하지만, 그 성능 차이는 미미하다.

3. 최종 결론

성능에 차이는 있으나, 미미하다. 그러므로 상황에 맞는 가독성이 높은 쪽으로 선택하는게 옳다고 나는 생각한다.

Digression

  • 컴파일러마다 어셈블리 코드 만드는게 달라, 다른 환경에선 똑같은 어셈코드를 만들 수 있다
  • for 과 while은 그 성능 보다는(연산 3개를 덜하거나 똑같을 수 있기에), 가독성 위주로 우선 코딩을 하고, 퍼포먼스 테스트 후에 이 것이 문제일 경우, 코드를 바꾸는 게 좋다.