728x90
반응형
해당 부분은 꽤 많이 들었던 소리다. foreach문을 사용하면 가비지가 발생하는 이슈가 있다. 최적화를 위해서는 foreach, Invoke, GetComponent 등을 자제하라는 말을 들었는데
Unity C#에서 foreach는 왜 가비지가 발생할까?
결론부터 말하자면 Unity 5.5버전 이상에서는 가바지가 발생하는 이슈가 수정되었다.
우선 원인은 Mono C# Unity 5.5 미만 버전에서는 foreach loop가 종료되면 값을 강제로 박싱하고 값 형식의 열거자를 생성하였는데 해당 열거자를 생성할 경우 loop가 종료되는 시점에 IDisposable 인터페이스를 구현 해야 했다. 인터페이스는 참조 형식이기 때문에 값 형식을 인터페이스로 변환하는 중에 박싱이 발생하게 되어서 가비지가 발생한다.
using (var enumerator in list.GetEnumerator())
{
while(enumerator.MoveNext())
{
int current = enumerator.Current;
}
}
Enumerator enumerator = list.GetEnumerator();
try
{
while(enumerator.MoveNext())
{
int current = enumerator.Current;
}
}
finally
{
var disposable = (System.IDisposable)enumerator;
disposable.Dispose();
}
foreach문의 내부를 보면 var disposable = (System.IDisposable)enumerator; 에서 박싱을 하고 있다.
단, List<>와 같은 명시적인 Collection을 foreach한 경우에는 가비지가 발생하지는 않지만 IEnumerable과 같이 인터페이스를 사용하는 경우 가비지가 발생한다고 합니다.
최적화 참고자료 : https://andrewfray.wordpress.com/2013/02/04/reducing-memory-usage-in-unity-c-and-netmono/
728x90
반응형
'C# > Unity' 카테고리의 다른 글
[Unity C#] 형변환 속도에 대해서 (int.Parse, ToString()) (2) | 2023.11.25 |
---|---|
[Unity C#] 기술 면접 대비 중급 질문들 (1) | 2023.11.14 |
[Unity C#] 기술 면접 대비 기본 질문들 (0) | 2023.11.14 |
[Unity C#] FillAmount 끝자리 위치 알기 (0) | 2023.09.18 |
[Unity C#] 유니티에서 Http 통신 (0) | 2023.09.09 |