일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- C++
- LeetCode
- pattern
- 머신러닝
- 문제풀이
- 2번
- 알고리즘
- 길 찾기
- 패턴
- 인공지능
- 디자인
- Unity
- 유니티
- A*
- GetComponet
- JPS
- ML Agent
- 팩토리
- desgin
- 디자인패턴
- Algorithm
- AI
- 게임
- 성능
- Factory
- 프로그래밍
- 디자인 패턴
- 강의
- 개발
- Design
Archives
- Today
- Total
Game Development
Unity Dictionary ContainsKey 와 TryGetValue 비교 본문
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 쓰는것이 좋다.
'Unity > Performance' 카테고리의 다른 글
C# Generic Enum Type을 효율적으로 Int로 변환시켜보자 (0) | 2022.10.05 |
---|---|
Unity GetComponent 위치에 따른 비용 비교 (0) | 2021.07.01 |
Unity 자식 클래스 참조 성능 비교 (0) | 2021.06.29 |
Unity Update 호출할 때, 사용되는 비용! (0) | 2021.06.26 |
Unity 반복문 성능 비교 (0) | 2021.06.25 |
Comments