Ssssong += Dev

[C#/유니티] (최적화) Dictionary와 Enum 본문

개발/공부

[C#/유니티] (최적화) Dictionary와 Enum

ssong_dev 2022. 11. 14. 17:27

https://docs.unity3d.com/kr/2018.4/Manual/BestPracticeUnderstandingPerformanceInUnity4-1.html

 

관리되는 힙에 대한 이해 - Unity 매뉴얼

많은 Unity 개발자들이 겪는 또 다른 일반적인 문제는 예기치 않은 관리되는 힙(managed heap)의 확장입니다. Unity에서 관리되는 힙은 축소되는 것보다 더 쉽게 확장됩니다. 이와 더불어, Unity의 가비

docs.unity3d.com

 

 

(유니티 메뉴얼 본문 내용. enum 타입을 Dictionary의 키로 사용하면 박싱이 발생한다는 내용이 적혀 있다.)

딕셔너리 및 열거형

 

기본적으로 Dictionary.add(key, value)를 호출하면 Object.getHashCode(Object)가 호출됩니다.

이 메서드는 Dictionary의 키에 적절한 해시 코드를 얻기 위해서 사용되며 Dictionary.tryGetValue, Dictionary.remove 등과 같이 키를 허용하는 모든 메서드에서 사용됩니다.

 

Object.getHashCode 메서드는 참조 형식이지만 enum 값은 항상 값 형식입니다. 따라서 열거형 키를 가지는 Dictionary의 경우, 모든 메서드 호출은 최소한 한 번씩은 키를 박싱합니다.

 

enum MyEnum { a, b, c };

var myDictionary = new Dictionary<MyEnum, object>();

myDictionary.Add(MyEnum.a, new object());

 

 

이 문제를 해결하려면 IEqualityComparer 인터페이스를 구현하는 사용자 정의 클래스를 작성하고, 그 클래스의 인스턴스를 Dictionary의 비교자로 할당하면 됩니다(참고: 이 오브젝트는 보통 무소속이므로, 메모리를 절약하기 위해 다른 Dictionary 인스턴스에 대해서도 사용할 수 있습니다).

 

public class MyEnumComparer : IEqualityComparer<MyEnum> {

    public bool Equals(MyEnum x, MyEnum y) {
        return x == y;
    }

    public int GetHashCode(MyEnum x) {
        return (int)x;
    }
}

 

 

 

 

그러나 이 문제는 2017년 업데이트에서 수정된 사항이다.

닷넷 .4 이전에는 IEqualityComparer로 인해 딕셔너리 key를 enum으로 걸 경우 박싱이 일어나기 때문에 성능 저하가 있었다.

그러나 이후 EnumEqualityComparer라는 enum 전용 비교자를 만들어서 박싱 과정을 거치지 않게 되었다는 내용이다.

 

https://pizzasheepsdev.tistory.com/2

 

이제는 Unity에서 Dictionary에 Enum을 사용해도 된다

유니티 최적화 관련해서 이런 얘기가 있다. 'Dictionary에 Enum을 Key로 사용하면 내부적으로 박싱이 일어나기 때문에, 사용해선 안된다.' 나도 최근에야 친한 지인분에게 이 얘기를 들었고 처음에 충

pizzasheepsdev.tistory.com

https://enghqii.tistory.com/69

 

C#에서 Dictionary에 Enum을 써도 괜찮은것 같다

전에 이런 글에서 Dictionary에 Key값으로 enum을 넣으면 내부에서 boxing이 일어나는데, 그 이유는 Dictionary 내부에서 IEqualityComarer로 ObjectEqualityComparer를 사용하게 되기 때문이라고 했다. 4 버전대 이상

enghqii.tistory.com

 

 

'개발 > 공부' 카테고리의 다른 글

[유니티] memory profiler  (0) 2022.12.08
[C#] [Effective C#] 생성자 내에서는 절대로 가상함수를 호출하지 말라  (0) 2022.11.16
Message Queue  (0) 2022.11.03
[C#] ReferenceEqual  (0) 2022.11.03
[유니티] Gamma와 Linear  (0) 2022.11.02