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개를 덜하거나 똑같을 수 있기에), 가독성 위주로 우선 코딩을 하고, 퍼포먼스 테스트 후에 이 것이 문제일 경우, 코드를 바꾸는 게 좋다.
'Study > C#' 카테고리의 다른 글
| Media APIs (0) | 2012.10.06 |
|---|---|
| Code Snippets (0) | 2012.10.06 |
| 12. 09. 22 (0) | 2012.09.22 |
| 12. 09. 22 (0) | 2012.09.22 |
| 종로비트 C# (0) | 2012.08.04 |