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


90

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

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

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


4
A KeyValuePair는 키이자 값이고, a Tuple<T1,T2>동일한 값 의 쌍입니다 . "사용할 수 List<Class>있다면 왜를 사용해야합니까?"라고 질문 할 수도 있습니다 Dictionary<A,B>.
Tim Schmelter 2013 년

4
맞습니다.하지만이 경우 키를 사용하여 데이터를 조회 할 수 있습니다. 의미가 있습니다. 이 경우 이름은 의미론 일 뿐이며 프로세서에 아무런 의미가 없습니다.
Nick Gotch

1
튜플은 동일한 값의 쌍이 아니지만 동일한 유형의 일부입니다. 아마도 이것은 nitpicking으로 보이지만 예를 들어 C는 동일한 값의 다른 표현에 대한 공용체 구조를 가지고 있습니다. :)
Jonas

답변:


65

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

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

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


1
나는 KeyValuePairs를 사전에 넣을 수 있지만 그 당시에는 결코 결과를 얻지 못하는 어려운 방법을 발견했습니다.
MKesper

3
또한, 새로운 새로운 C # 7.0 지원, 튜플에 대한 간단한 구문, 훨씬 더 쉽게들을 만들고 KeyValuePairs 이상으로 작업에 확대됨. visualstudiomagazine.com/articles/2017/01/01/…
Jacob Stamm

1
또한 튜플에서 매개 변수의 이름을 지정하는 기능은 소비자가 매개 변수의 용도를 더 쉽게 이해할 수 있도록합니다. KVP와 같은 일반적인 경우 실제로는 누구나 추측 할 수 있습니다. 어딘가에 구체적으로 문서화되어 있지 않으면 키가 "되어야"하는 것입니다. 즉, 유형이 아니라 설정 이름과 같은 실제 세계의 것입니다. 등을 보장 번호,
rory.ap

40

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

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

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

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


2
그들이 다른 목적을 어떻게 수행합니까? 자세히 설명해 주시겠습니까?
OldSchool

1
@YakRangi keyvaluepair는 사전에있는 키와 값에 대한 컨테이너로 사용됩니다. 그렇지 않으면 용도가 없습니다. 반면에 Tuple은 임의로 관련된 멤버를 함께 저장하는 데 사용할 수 있습니다. 또한 튜플에 여러 구성원이 아닌 2 결합 저장할 수 있습니다
스리 람 Sakthivel

@SriramSakthivel 이것은 OP 질문에 대한 대답은 다음과 같습니다. 사전을 검색하지 않는 한 KVP를 사용하지 마십시오.
Alex Fainshtein

23

의미론에도 불구하고 두 옵션을 모두 고려할 때 성능이 중요한 고려 사항 일 수 있습니다. 앞서 언급했듯이 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로드


0

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


2
그는 올바른 질문을했습니다. 어떤 용도로 더 나은지에 대한 질문은 명시 적으로 암시됩니다.
Greg

질문이 더 나은 초콜릿 또는 소다가되는 @Greg 그러나 구체적인 질문은 무의미하고 더 나은 음식과 음료에 대한 일반적인 질문으로 해결
MikeT

3
실질적인 질문은 "Tuples Vs. KeyPairs를 언제 사용해야합니까?"입니다. 정당한 질문입니다. 나는 당신이 "better"라는 단어의 의미에 갇혀 있다고 생각합니다.
Greg
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.