일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 프로그래밍
- 패턴
- Algorithm
- 게임
- GetComponet
- Unity
- LeetCode
- C++
- 유니티
- pattern
- 성능
- 강의
- desgin
- 팩토리
- 개발
- 디자인
- JPS
- Design
- 2번
- 머신러닝
- 알고리즘
- 디자인패턴
- 길 찾기
- 인공지능
- A*
- ML Agent
- 디자인 패턴
- AI
- Factory
- 문제풀이
Archives
- Today
- Total
Game Development
Unity 반복문 성능 비교 본문
반복문 성능비교
유니티를 사용하시면서 많은 반복문을 사용하게 될것 입니다. 그렇기에 가장 성능적으로 반복문 방식이 무엇인지 알아보도록 하겠습니다.
1. For 문과 Foreach 중 무엇이 더 빠를까요?
처음에 많은 사람들이 사용하기 편한 Foreach를 사용하고 있을 수 있습니다.
하지만 아래의 데이터를 보시게 된다면 충격을 받을실 수 있습니다.
초기화는 아래와 같이 진행하였습니다.
int count = 100000000;
private void Init()
{
for ( int i = 0; i < count; i++ )
{
value.AddLast(Random.Range(1, 100));
}
}
테스트 방식
1. 각각 1억번의 반복문을 돌리며 시작 시점에서 부터 끝나는 시점 까지의 시간을 구합니다.
2. 각각의 변수를 참조하여 A라는 변수에 넣어보도록 하겠습니다.
테스트 코드 ( List )
private void ForTime()
{
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
int a = 0;
for (var i = 0; i < value.Count; i++)
{
a = value[i];
}
sw.Stop();
Debug.Log((sw.ElapsedMilliseconds.ToString()));
}
private void ForeachTime()
{
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
int a = 0;
foreach (int i in value)
{
a = i;
}
sw.Stop();
Debug.Log((sw.ElapsedMilliseconds.ToString()));
}
For 문을 이용한 방식 | ForEach를 이용한 방식 |
134ms | 250ms |
테스트 코드 ( LinkedList )
테스트 방식
1. 해당 테스트 방식은 1 억번 연산시 컴퓨터가 터질려고 하여 '10 만번'으로 변경하였습니다.
private void ForTime()
{
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
int a = 0;
for (var i = 0; i < value.Count; i++)
{
a = value.ElementAt(i);
}
sw.Stop();
Debug.Log((sw.ElapsedMilliseconds.ToString()));
}
private void ForeachTime()
{
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
int a = 0;
foreach (int i in value)
{
a = i;
}
sw.Stop();
Debug.Log((sw.ElapsedMilliseconds.ToString()));
}
For 문을 이용한 방식 | ForEach를 이용한 방식 |
78358ms | 1ms |
반복문 성능 높이기
int len = value.Count;
for (var i = 0; i < len; i++)
{
a = value[i];
}
위에 코드처름 Count를 따로 캐싱해서 사용할 경우 속도가 2배 정도 빠르게 됩니다.
결론
그냥 for문으로 개발하자 어차피 LinkedList를 System.Linq로 접근하는거 부터가 비효율 적이다.
마지막 한마디
100ms의 차이가 사소하다고 생각할지 몰라도 이것이 쌓이고 쌓이면 10초의 차이가 만들어진다.
'Unity > Performance' 카테고리의 다른 글
C# Generic Enum Type을 효율적으로 Int로 변환시켜보자 (0) | 2022.10.05 |
---|---|
Unity Dictionary ContainsKey 와 TryGetValue 비교 (0) | 2021.07.01 |
Unity GetComponent 위치에 따른 비용 비교 (0) | 2021.07.01 |
Unity 자식 클래스 참조 성능 비교 (0) | 2021.06.29 |
Unity Update 호출할 때, 사용되는 비용! (0) | 2021.06.26 |
Comments