튜플과 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하지 않습니다. 튜플은 비교 가능하며 IComparable및 IStructuralEquatable인터페이스 를 구현 하므로 두 튜플을 비교하기가 더 쉽습니다.


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.