안녕하세요
Dictionary를 Linq로 호출하는 성능 테스트 중에 이상한 점을 발견하여 블로그로 적게 되었습니다.
유니티 버전: 2022.3.44f1
foreach (var keypair in dictionary)
{
if (keypair.Value.GroupID == groupID)
{
// ... //
}
}
데이터를 찾기 편하게 Dictionary를 사용하는 경우가 많은데, 개발하다 보면 Key가 아닌 값으로 찾아야 하는 경우가 종종 있습니다.
이럴 때 위 코드처럼 foreach를 이용해서 찾게 됩니다.
Dictionary<TKey,TValue>.Values 속성 (System.Collections.Generic)
Dictionary<TKey,TValue>의 값을 포함하는 컬렉션을 가져옵니다.
learn.microsoft.com
그런데 대부분 Key값을 사용하는 경우가 없거나 Key값을 Value에서도 가지고 있기 때문에 실제로는 Value만 불러와도 됩니다.
C# Dictionary에는 Values 프로퍼티가 있는데, 이 프로퍼티를 이용하는 코드로 바꿔보겠습니다.
foreach (var v in dictionary.Values)
{
if (v.GroupID == groupID)
{
// ... //
}
}
이전에 Key와 Value를 모두 가져오는 코드에서 Value만 가져오는 코드로 전환했습니다.
![]() |
![]() |
왼쪽이 foreach문 그대로 실행, 오른쪽이 Values 프로퍼티를 통해 foreach문을 실행한 결과입니다.
걸리는 시간만 봤을 때는 2배 이상 차이가 납니다.
var results = dictionary
.Where(_ => _.Value.x == value)
.Select(_ => _.Value);
var results = dictionary.Values
.Where(_ => _.x == value);
물론 Linq를 이용할 때도 Select를 이용한다는 가정 하에 Values프로퍼티를 참조하는 게 더 빠릅니다.
결론
Dictionary에서 Value의 Key가 아닌 필드로 데이터를 찾는 경우, Values프로퍼티를 이용하는 것이 좋다.
'Unity Tips' 카테고리의 다른 글
UniTask 사용 후기 (0) | 2024.08.04 |
---|---|
Unity 2020.2버전 이상에서 빌드 할 때 Spine Mesh 최적화로 느려지는 문제 (1) | 2024.03.17 |
NSprites - Unity ECS용 Sprite Renderer, Sprite Animation 프레임워크 (1) | 2023.11.19 |
Unity Entities - Job에서 EntityManager, EntityCommandBuffer 사용 방법 (0) | 2023.07.04 |
Unity Entities - System에서 Collections(NativeArray, NativeList ...) Dispose함수를 Job 이후에 실행하는 방법 (0) | 2023.07.04 |