본문 바로가기
Engine/Unity3D

무한루프시 for문과 while문의 차이

by 황금표정 2019. 7. 19.

오늘은 무한루프시 while문과 for문을 이용할때에 대한 차이점에 대해서 작성합니다.

반복문은 주로 for문 또는 while문을 사용하는데 사용할 때 어떻게 사용되느냐에 따라서 성능이 차이가 날 수 있습니다.

이 글에서 다루는 내용은 아래와 같은 스타일의 반복문입니다.

※ 아래의 설명하는 코드에 대해서만 측정결과를 나타내므로 while문에 조건 및 for문에 조건이 들어갈 경우 결과가 다를 수 있습니다.

// while
void LoopFunction_while()
{
    int Sum = 0;
    while(true)
    {
        Sum = Sum + 1;
        if(Sum >= 10)
            break;
    }
}

// for
void LoopFunction_for()
{
    int Sum = 0;
    for(;;)
    {
        Sum = Sum + 1;
        if(Sum >= 10)
            break;
    }
}

해당 반복문 2가지에 대해서 UnityEngine에서 퍼포먼스를 비교해보았습니다.

 

테스트 환경

UnityVersion  2019.1.7f1
Scripting Runtime Version .Net 4.x Equivalent
Api Compatibility Level .Net Standard 2.0
Test Loop Count 10,000,000회

 

총 10회를 테스트한 뒤 아래와 같은 결과를 얻었습니다.

  LoopFunction_while() LoopFunction_for()
1 0.4958496 0.3246689
2 0.4927826 0.3218422
3 0.4930801 0.3228893
4 0.4958496 0.3246689
5 0.4927826 0.3218422
6 0.4930801 0.3228893
7 0.4940195 0.3252239
8 0.4928875 0.3232489
9 0.4979477 0.3242941
10 0.4949732 0.3241596
평균 0.49432525 0.32357273

 

 

위에 측정한 데이터의 샘플코드는 아래에서 확인 할 수 있습니다.

 

 

 

 

이러한 결과의 이유

반복문 내부에서 수행하는 로직은 둘 다 동일합니다.

그래서 IL코드를 통해 코드가 어떻게 변하는지 확인해보았습니다.

 

아래는 Unity에서 생성된 Assembly-CSharp파일에 대한 디컴파일 결과입니다.

LoopFunction_for() 함수는 아래와 같이 변하였고

 

 

Assembly-CSharp으로 변환된 LoopFunction_for()

 

LoopFunction_while() 함수는 아래와 같이 변했습니다.

 

Assembly-CSharp으로 변환된 LoopFunction_while()

 

두 결과가 동일하네요?

하지만 IL코드로 변환하면 달라집니다.

 

 

좌측, LoopFunction_for(), 우측, LoopFunction_while()

 

 

while로 만들어진 경우 내부적으로 저 두줄이 추가가되는데, 저 부분은 정수1을 추가하고 할당하는 작업입니다.

(아마도..?)

 

저 부분에 의해서 성능 측정시 for문이 더 빠른것으로 보입니다.

본문 앞에서도 적어두었지만 앞에 테스트한 코드 케이스에 대해서 측정한 결과이므로 실제 사용하시는 코드에서는 결과가 다를 수 있으므로 꼭 테스트를 해보시고 적용하시는 것을 권장드립니다.

 

 

 

 

 

 

 

반응형