Game Development

Unity Dictionary ContainsKey 와 TryGetValue 비교 본문

Unity/Performance

Unity Dictionary ContainsKey 와 TryGetValue 비교

Dev Owen 2021. 7. 1. 02:31

Dictionary ContainKey vs TryGetValue

Dictionary에 원하는 Key에 값이 있는지 확인할 떄 2개의 함수를 사용합니다.

해당 두 기능을 비교하여 어떤 함수가 더욱 빠른지 그리고 왜 빠른지에 대해서 알아보도록 하겠습니다


테스트 방식

각각의 함수를 천 번씩 호출하여 어느 함수가 더욱 효율적인지 비교해보도록 하겠습니다.

ContainKey

Dictionary<string, int> dic = new Dictionary<string, int>();
private void Awake() 
{
    int len = 100000000;
    int outValue;
    dic["str"] = 1;

    sw.Start();
    for ( int i = 0; i < len; i++ )
    {
        if (dic.ContainsKey("str") == true)
        {
            outValue = dic["str"];
        }
    }

    sw.Stop();
    UnityEngine.Debug.Log(sw.ElapsedMilliseconds);
}

TryGetValue

Dictionary<string, int> dic = new Dictionary<string, int>();
private void Awake() 
{
    int len = 100000000;
    int outValue;
    dic["str"] = 1;

    sw.Start();
    for ( int i = 0; i < len; i++ )
    {
        dic.TryGetValue( "str", out outValue );
    }

    sw.Stop();
    UnityEngine.Debug.Log(sw.ElapsedMilliseconds);
}
ContainsKey TryGetValue
4048 ms 2117 ms

 

속도 차이가 약 2배가 차이가 나는것을 볼 수 있습니다. 사실 코드만 봐도 충분히 유추를 해낼 수 있습니다.


동작하는 방식이 다른가?

사실 내부적으로 동작하는 방식은 똑같다. 하지만 값을 담기 위해서 ContainsKey는 한번 더 참조를 해야하기 떄문에 시작이 배로 걸리는 것입니다. 만약 키가 있는지만 알고 싶다면 ContainsKey가 오히로 조금 더 빠른 결과를 보여주고 있습니다.


키만 비교하는 경우 ( 추가 테스트 )

ContainKey

private void Awake() 
{
    int len = 100000000;
    int outValue;
    dic["str"] = 1;

    sw.Start();
    for ( int i = 0; i < len; i++ )
    {
        if (dic.ContainsKey("str") == true)
        {
            // todo
        }
    }

    sw.Stop();
    UnityEngine.Debug.Log(sw.ElapsedMilliseconds);
}

TryGetValue

Dictionary<string, int> dic = new Dictionary<string, int>();
private void Awake() 
{
    int len = 100000000;
    int outValue;
    dic["str"] = 1;

    sw.Start();
    for ( int i = 0; i < len; i++ )
    {
        if (dic.TryGetValue("str", out outValue) == true)
        {
            // todo
        }
    }

    sw.Stop();
    UnityEngine.Debug.Log(sw.ElapsedMilliseconds);
}
ContainsKey TryGetValue
2087 ms 2116 ms

결론

대부분 상황에서 TryGetValue 쓰는것이 좋다.

Comments