セマンティクスにもかかわらず、両方のオプションを検討する場合、パフォーマンスは重要な考慮事項になる可能性があります。前述のように、KeyValuePair
は値型(struct)であるのに対し、Tuple<>
は参照型(class)です。したがって、はKeyValuePair
スタックにTuple<>
割り当てられ、はヒープに割り当てられます。最適な選択は通常、スタックとヒープメモリの割り当ての古典的な引数によって決定されます。要するに、スタックスペースは限られていますが、一般的に非常に高速にアクセスできます。ヒープメモリははるかに大きくなりますが、やや遅くなります。
KeyValuePair<T1, T2>
キーと値の両方のタイプは、プリミティブ(値型が好きであれば良い選択であり得るint
、bool
、double
、など)または小型の構造体。スタックにプリミティブ型があるため、割り当てと割り当て解除は非常に高速です。これは、特に再帰的なメソッド呼び出しへの引数として、パフォーマンスに実際に影響を与える可能性があります。
一方、またはが参照型(クラスなど)であるTuple<T1, T2>
場合は、おそらくより適切な選択です。とにかくオブジェクトをヒープ上で検索する必要があるため、参照型(キーまたは値型として)へのポインターを含むAは、目的を打ち破ります。T1
T2
KeyValuePair
これが私がオンラインで見つけたベンチマークです:タプル対KeyValuePair。このベンチマークの唯一の問題は、KeyValuePair<string, string>
vs Tuple<string, string>
。をテストしたことです。このstring
型は、実行コンテキストに応じて値型や参照型の両方のように動作できるという点で、.NETでは珍しい特殊な型です。KeyValuePair<int, int>
に対して明らかに勝者だったと思いますTuple<int, int>
。ただし、欠陥がある場合でも、結果はパフォーマンスの違いが大きくなる可能性があることを示しています。
8.23 NS -タプル割り当て
0.32ナノ秒- 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>
。