什么时候使用Tuple和KeyValuePair最好?
我通常使用KeyValuePair<TKey,TValue>
types,只要我有一对是相关的数据,意思是一个是另一个的关键。 如果数据是不相关的,那么Tuple<T1,T2>
types就更有意义了,我愿意这样做。
现在我只是阅读这篇文章 ,为什么一般要避免KeyValuePair<TKey,TValue>
,喜欢Tuple<T1,T2>
。 主要参数是Tuple<T1,T2>
的性能优势。
在表演之外,是否有任何理由认为KVP会比Tuple<T1,T2>
更好?
那么,这种types可以被认为是不好的名字,一个。 一个名为KeyValuePair应该代表一个键和一个值。 如果你的两个对象不是一个关键和价值,那么只有两件事情呢? 如果我看到一个KeyValuePair<TKey, TValue>
types的方法或属性,我期望KVP的值是一个键和一个值。 这实际上只是一个沟通意图的问题,将来要明确自己,或者可能是其他团队成员。 元组不表示这种关联。
元组也可以更容易地添加另一个值,使它成为一个三元组(或者三元组,但是您想要调用它)。 一些.NET语言,如F#, 也有一些特殊的元组语法 。
对于一个实现的angular度来说, Tuple
做了许多KeyValuePair
没有的事情。 元组具有可比性,它们实现了IComparable
和IStructuralEquatable
接口,所以它比较容易比较两个元组。
KeyValuePair
是结构, Tuple
是一个类。
这是影响如何通过引用或值复制对象的主要区别。
因此Tuple<T1,T2>
在32位操作系统中使用“4byte”,而KeyValuePair<K,V>
需要更多基于“K和V”
无论如何比较Tuple和KeyValuePair不是一个好主意(对我来说是不合理的),因为两者都有不同的目的。
尽pipe有语义,但考虑到两种select,性能可能是一个重要的考虑因素。 如前所述, KeyValuePair
是一个值types(struct),而Tuple<>
是一个引用types(class)。 因此, KeyValuePair
被分配在堆栈上, Tuple<>
被分配在堆上,最佳select通常由堆栈与堆内存分配的经典参数决定。 总之,堆栈空间是有限的,但通常访问速度非常快。 堆内存要大得多,但速度要慢一些。
KeyValuePair<T1, T2>
可能是更好的select,如果键和值types都是原始types(值types如int
, bool
, double
等)或小尺寸的结构。 对于堆栈中的原始types,分配和释放是闪电般的。 这可以真正影响性能,尤其是在recursion方法调用中。
另一方面,如果T1
或T2
是引用types(如类), Tuple<T1, T2>
可能是更好的select。 包含指向引用types(作为键或值types)的指针的KeyValuePair
目的,因为无论如何都需要在堆上查找对象。
这是我在网上find的基准: Tuple与KeyValuePair 。 这个基准testing的唯一问题是他们testing了KeyValuePair<string, string>
和Tuple<string, string>
,而且string
types在.NET中是一个不寻常和特殊的types,它可以performance得像一个值types和/或者取决于执行上下文的引用types。 我相信KeyValuePair<int, int>
对Tuple<int, int>
是一个明显的胜利者。 但是,即使存在这些缺陷,结果也表明性能差异可能是显着的:
8.23 ns – 分配元组
0.32 ns – 分配KeyValuePair (快25倍!)1.93 ns – 传递Tuple作为参数
2.57 ns – 传递KeyValuePair作为参数1.91 ns – 返回元组
6.09 ns – 返回KeyValuePair2.79 ns – 从列表中加载元组
4.18 ns – 从列表中加载KeyValuePair
你真的问错误的问题正确的问题是使用一个类(Tuple)_比结构(KVP)更好,在这种情况下答案是你想要使用他们和答案在这里给出结构与类