오늘은 무한루프시 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() 함수는 아래와 같이 변하였고
LoopFunction_while() 함수는 아래와 같이 변했습니다.
두 결과가 동일하네요?
하지만 IL코드로 변환하면 달라집니다.
while로 만들어진 경우 내부적으로 저 두줄이 추가가되는데, 저 부분은 정수1을 추가하고 할당하는 작업입니다.
(아마도..?)
저 부분에 의해서 성능 측정시 for문이 더 빠른것으로 보입니다.
본문 앞에서도 적어두었지만 앞에 테스트한 코드 케이스에 대해서 측정한 결과이므로 실제 사용하시는 코드에서는 결과가 다를 수 있으므로 꼭 테스트를 해보시고 적용하시는 것을 권장드립니다.
'Engine > Unity3D' 카테고리의 다른 글
Unity 'AndroidJavaClass', 'Android JNI' 관련 에러 해결 방법 (1) | 2021.04.16 |
---|---|
[Mac] MacOS Catalina Unitypackage Zip 파일 해제가 이상할 때 (0) | 2019.10.19 |
C# 프로퍼티에서 주의할 점 (2) | 2019.07.09 |
Inspector의 값을 유지한 상태로 변수명 변경하는 방법 (0) | 2019.07.04 |
[Webinar] DOTS(데이터 지향 기술 스택) 설명 영상 (0) | 2019.06.26 |