의미론에도 불구하고 두 옵션을 모두 고려할 때 성능이 중요한 고려 사항 일 수 있습니다. 앞서 언급했듯이 KeyValuePair
는 값 유형 (구조체)이고은 Tuple<>
참조 유형 (클래스)입니다. 따라서 KeyValuePair
스택 Tuple<>
에 할당되고 힙에 할당되며 최적의 선택은 일반적으로 스택 대 힙 메모리 할당 의 고전적인 인수에 의해 결정됩니다 . 요컨대, 스택 공간은 제한적이지만 일반적으로 매우 빠르게 액세스 할 수 있습니다. 힙 메모리는 훨씬 더 크지 만 다소 느립니다.
KeyValuePair<T1, T2>
키와 값 두 가지 유형이 프리미티브 (값 유형이 좋아하는 경우에 더 나은 선택이 될 수 있습니다 int
, bool
, double
, 등) 또는 작은 크기의 구조체. 스택의 기본 유형을 사용하면 할당 및 할당 해제가 매우 빠릅니다. 이는 특히 재귀 메서드 호출에 대한 인수로서 성능에 실제로 영향을 미칠 수 있습니다.
반면에 또는 참조 유형 (예 : 클래스) 인 Tuple<T1, T2>
경우 더 나은 선택 일 수 있습니다 . 참조 유형 (키 또는 값 유형)에 대한 포인터를 포함 하는 A 는 객체가 어쨌든 힙에서 조회되어야하기 때문에 목적을 무효화합니다.T1
T2
KeyValuePair
온라인에서 찾은 벤치 마크는 Tuple 대 KeyValuePair 입니다. 이 벤치 마크에 대한 유일한 문제는 그들이 시험이다 KeyValuePair<string, string>
대를Tuple<string, string>
string
은 .NET과 하여 했으며 유형이 실행 컨텍스트에 따라 값 유형 및 / 또는 참조 유형처럼 동작 할 수 있다는 점에서 .NET에서 특이하고 특수한 유형이라는 것입니다. 나는 KeyValuePair<int, int>
에 대한 확실한 승자가 될 것이라고 믿는다 Tuple<int, int>
. 그러나 결함이 있더라도 결과는 성능 차이가 상당 할 수 있음을 보여줍니다.
8.23ns-튜플 할당
0.32 ns의 KeyValuePair을 할당 - (빠른 25 배!)
1.93ns-튜플을 인수로 전달
2.57ns-KeyValuePair를 인수로 전달
1.91ns-튜플 반환 6.09ns
-KeyValuePair 반환
2.79ns-목록에서 튜플로드 4.18ns-목록
에서 KeyValuePair로드
KeyValuePair
는 키이자 값이고, aTuple<T1,T2>
는 동일한 값 의 쌍입니다 . "사용할 수List<Class>
있다면 왜를 사용해야합니까?"라고 질문 할 수도 있습니다Dictionary<A,B>
.