글 작성자: Doublsb

프로파일러를 뚫어지게 쳐다보다가 이상한 것을 발견했다.

별 생각 없이 사용하고 있던 enum값의 ToString()이 파멸을 초래하고 있었다.

 

한번 Call을 할 때마다 0.003ms를 먹어치우고 있던 상황.

코드에서는 1프레임에 80번을 호출하고 있었으니 자그마치 0.24ms를 차지하고 있던 셈이다.

 

찾아보니 원래 enum.ToString()은 값이 비싼 메서드라고 한다. 왜냐면 리플렉션을 사용하니까!

조금만 생각해봐도 값이 비싼건 당연한 것이다.

 

이를 해결하기 위해서 다양한 방법들을 찾아보았다.


1. 자체 Dictionary에 캐싱

//데이터는 입력되었다고 가정
private readonly Dictionary<SpecificEnum, string> e_s_cache = new Dictionary<SpecificEnum, string>();

public string ToString(SpecificEnum value) => e_s_cache[value];

특정 Enum의 Dictionary를 선언해서 캐싱하는 방법이다. 바로 떠올릴 수 있는 방법.

 

 

2. 범용 Dictionary에 캐싱

private static readonly Dictionary<Enum, string> E_S_Cache = new Dictionary<Enum, string>();

public static string ToString(this Enum value)
{
	if (!E_S_Cache.ContainsKey(value))
		E_S_Cache.Add(value, value.ToString());

	return E_S_Cache[value];
}

어떤 Enum이든 상관 없이 캐싱하는 방법이다. 종속성이 사라져서 쓰기 편하다.

 

 

3. Switch문으로 하드코딩

public static string ToString(SpecificEnum value)
{
	switch(value)
    {
    	case SpecificEnum.A:
        	return "A";
        
        case SpecificEnum.B:
        	return "B";
    }
}

신나는 스위치 하드코딩 방법이다. ^w^..

 


방법을 적용하고 나니, 0.003ms는 흔적도 없이 사라져 버렸다. 베리 굿.

 

https://www.meziantou.net/caching-enum-tostring-to-improve-performance.htm

 

Caching Enum.ToString to improve performance - Gérald Barré

In this post, I describe how to improve the performance of the Enum.ToString() method in .NET when performance is critical.

www.meziantou.net

이 글의 도움을 받았다. 무려 각 소스에 대한 벤치마크도 있으므로 참고해보자.

속도로는 스위치 하드코딩이 가장 빨랐다.

반응형