[.net] 튜플과 KeyValuePair를 사용하는 것이 언제 더 낫습니까?

나는 일반적으로 KeyValuePair<TKey,TValue>하나가 다른 하나의 키라는 의미에서 쌍 관련 데이터가있을 때마다 유형을 사용했습니다 . 데이터가 관련이 없으면 Tuple<T1,T2>유형이 더 합리적이며 그와 함께 갈 것입니다.

이제 나는 왜 일반적으로 피하고 선호 하는지에 대해이 기사 를 읽었다 . 주요 주장은 .KeyValuePair<TKey,TValue>Tuple<T1,T2>Tuple<T1,T2>

외부 성능, KVP가 더 나은 선택이 될 이유가 Tuple<T1,T2>있습니까?



답변

글쎄, 그 유형은 이름이 좋지 않은 것으로 간주 될 수 있습니다. 명명 된 KeyValuePair는 키와 값을 나타내야합니다. 두 개체가 실제로 키와 값이 아니라 두 가지만 있다면 어떨까요? 유형이 KeyValuePair<TKey, TValue>인 메서드 또는 속성을 보게 되면 KVP의 값이 키와 값이 될 것으로 예상합니다. 이것은 실제로 의도를 전달하고 미래에 자신이나 다른 팀원에게 명확하게 알리는 문제입니다. 튜플은 그런 종류의 연관성을 나타내지 않습니다.

튜플은 또한 다른 값을 더 쉽게 추가 할 수있게하여 3 튜플 (또는 3 중항이라고 부르고 싶은데)으로 만듭니다. F #과 같은 일부 .NET 언어에는 튜플에 대한 특수 구문 도 있습니다.

구현 관점에서 Tuple많은 일을 KeyValuePair하지 않습니다. 튜플은 비교 가능하며 IComparableIStructuralEquatable인터페이스 를 구현 하므로 두 튜플을 비교하기가 더 쉽습니다.


답변

KeyValuePair구조체이고 Tuple클래스입니다.

이것이 참조 또는 값에 의해 객체가 복사되는 방식에 영향을 미치는 주요 차이점입니다.

따라서 Tuple<T1,T2>전달 될 때 32 비트 OS에서 “4byte”만 사용하는 반면 KeyValuePair<K,V>“K 및 V”를 기반으로 더 많이 필요합니다.

어쨌든 Tuple과 KeyValuePair를 비교하는 것은 둘 다 다른 목적을 제공하기 때문에 좋은 생각이 아닙니다 (나에게 의미가 없습니다).


답변

의미론에도 불구하고 두 옵션을 모두 고려할 때 성능이 중요한 고려 사항 일 수 있습니다. 앞서 언급했듯이 KeyValuePair는 값 유형 (구조체)이고은 Tuple<>참조 유형 (클래스)입니다. 따라서 KeyValuePair스택 Tuple<>에 할당되고 힙에 할당되며 최적의 선택은 일반적으로 스택 대 힙 메모리 할당 의 고전적인 인수에 의해 결정됩니다 . 요컨대, 스택 공간은 제한적이지만 일반적으로 매우 빠르게 액세스 할 수 있습니다. 힙 메모리는 훨씬 더 크지 만 다소 느립니다.

KeyValuePair<T1, T2>키와 값 두 가지 유형이 프리미티브 (값 유형이 좋아하는 경우에 더 나은 선택이 될 수 있습니다 int, bool, double, 등) 또는 작은 크기의 구조체. 스택의 기본 유형을 사용하면 할당 및 할당 해제가 매우 빠릅니다. 이는 특히 재귀 메서드 호출에 대한 인수로서 성능에 실제로 영향을 미칠 수 있습니다.

반면에 또는 참조 유형 (예 : 클래스) 인 Tuple<T1, T2>경우 더 나은 선택 일 수 있습니다 . 참조 유형 (키 또는 값 유형)에 대한 포인터를 포함 하는 A 는 객체가 어쨌든 힙에서 조회되어야하기 때문에 목적을 무효화합니다.T1T2KeyValuePair

온라인에서 찾은 벤치 마크는 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로드


답변

당신의 정말 잘못된 질문을 올바른 질문은 Struct (KVP)보다 더 나은 Class (Tuple) _ 사용하는 것입니다.이 경우 대답은 당신이 그들을 사용하고 싶은 것이고 대답은 여기에 주어집니다 Structs vs classes


답변