클라이언트 프로그래머의 일기/신입 클라이언트 프로그래머의 일기

C# Dictionary ContainsKey와 TryGetValue 뭐가 더 효율적인가?

ckhyeok 2020. 10. 14. 12:55

1. Dictonary<TKey, TValue>.ContainsKey(TKey) 메서드는

 

Dictionary에 지정한 키가 포함되어 있는지 여부를 확인하는 메서드 입니다.

 

Boolean으로 반환하며, 키가 있는 요소가 포함되어 있으면 true, 없으면 false를 반환합니다

 

 

2. Dictionary<TKey, TValue>.TryGetValue(TKey, TValue) 메서드는

 

Dictionary에 지정한 키가 포함되어 있는지 여부를 확인하는 메서드 입니다.

 

마찬가지로 Boolean으로 반환하며, 키가 있는 요소가 포함되어 있으면 true, 없으면 false를 반환합니다

 

 

아래 코드로 벤치 마크 결과 TryGetValue가 약간 더 빨랐습니다.

static void Main(string[] args)
{
    const int size = 1000000;

    var dict = new Dictionary<int, string>();

    for (int i = 0; i < size; i++)
    {
        dict.Add(i, i.ToString());
    }

    var sw = new Stopwatch();
    string result;

    sw.Start();

    for (int i = 0; i < size; i++)
    {
        if (dict.ContainsKey(i))
            result = dict[i];
    }

    sw.Stop();
    Console.WriteLine("ContainsKey + Item for {0} hits: {1}ms", size, sw.ElapsedMilliseconds);

    sw.Reset();
    sw.Start();

    for (int i = 0; i < size; i++)
    {
        dict.TryGetValue(i, out result);
    }

    sw.Stop();
    Console.WriteLine("TryGetValue for {0} hits: {1}ms", size, sw.ElapsedMilliseconds);

}

(ContainsKey + 1000000 조회수 : 45ms)

(1000000 조회에 대한 TryGetValue : 26ms)

 

 

 

공통점

- 내부적으로 동일한 검사를 사용함.

- Item 속성은 실제로 TryGetvalue false와 같은 예외를 throw 한다는 점 제외하면 대부분 동일함.

 

차이점

- ContainsKey는 기본적으로 사용 되는 Item에 조회 기능이 복제되며, 이 경우 대부분 계산이 수행됨.

 

 

 

 

잘 정리해 둔 블로그 주소

m.blog.naver.com/PostView.nhn?blogId=crusaderholy&logNo=100112263890&proxyReferer=https:%2F%2Fwww.google.com%2F