Enum.ToString 최적화하기
글 작성자: 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
이 글의 도움을 받았다. 무려 각 소스에 대한 벤치마크도 있으므로 참고해보자.
속도로는 스위치 하드코딩이 가장 빨랐다.
반응형
'프로그래밍 > C#' 카테고리의 다른 글
C# 8.0 새 기능 알아보기 (0) | 2022.09.20 |
---|---|
C# 구조체 : 기본 매개변수를 사용한 생성자는 호출되지 않을 수도 있다 (0) | 2022.07.10 |
[.Net C# 설명서] 읽고 정리하기 (0) | 2021.09.29 |
[C# 코딩의 기술]에서 얻은 지식들 (0) | 2021.09.24 |
C# 연산자 오버로딩 : ==, Equals에서 null값 판단하기 (0) | 2021.03.24 |
댓글
이 글 공유하기
다른 글
-
C# 8.0 새 기능 알아보기
C# 8.0 새 기능 알아보기
2022.09.20 -
C# 구조체 : 기본 매개변수를 사용한 생성자는 호출되지 않을 수도 있다
C# 구조체 : 기본 매개변수를 사용한 생성자는 호출되지 않을 수도 있다
2022.07.10 -
[.Net C# 설명서] 읽고 정리하기
[.Net C# 설명서] 읽고 정리하기
2021.09.29 -
[C# 코딩의 기술]에서 얻은 지식들
[C# 코딩의 기술]에서 얻은 지식들
2021.09.24