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
반응형

+ Recent posts