A pesar de la semántica, el rendimiento puede ser una consideración importante al considerar ambas opciones. Como se mencionó anteriormente, KeyValuePair
es un tipo de valor (estructura), mientras que Tuple<>
es un tipo de referencia (clase). Por lo tanto, KeyValuePair
se asigna en la pila y Tuple<>
se asigna en el montón, y la elección óptima suele estar determinada por los argumentos clásicos de asignación de memoria de pila frente a montón . En resumen, el espacio de la pila es limitado, pero generalmente tiene un acceso muy rápido. La memoria del montón es mucho más grande pero algo más lenta.
KeyValuePair<T1, T2>
puede ser la mejor opción si tanto la clave y valor tipos son primitivas (tipos de valor como int
, bool
, double
, etc.) o estructuras de pequeño tamaño. Con tipos primitivos en la pila, la asignación y la desasignación son muy rápidas. Esto realmente puede afectar el rendimiento, especialmente como argumentos para llamadas a métodos recursivos.
Por otro lado, Tuple<T1, T2>
es probable que sea la mejor opción si T1
o T2
son tipos de referencia (como clases). Un KeyValuePair
que contiene punteros a tipos de referencia (como los tipos de clave o valor) en cierto modo frustra el propósito, ya que los objetos deberán buscarse en el montón de todos modos.
Aquí hay un punto de referencia que encontré en línea: Tuple vs. KeyValuePair . El único problema con este punto de referencia es que probaron KeyValuePair<string, string>
vs. Tuple<string, string>
, y el string
tipo es un tipo inusual y especial en .NET, ya que puede comportarse como un tipo de valor y / o un tipo de referencia dependiendo del contexto de ejecución. Creo que el KeyValuePair<int, int>
hubiera sido un claro ganador en contra Tuple<int, int>
. Sin embargo, incluso con las deficiencias, los resultados muestran que las diferencias de rendimiento pueden ser significativas:
8.23 ns - Asignar tupla
0.32 ns - Asignar KeyValuePair (¡25 veces más rápido!)
1.93 ns - Pasa Tuple como argumento
2.57 ns - Pasa KeyValuePair como argumento
1.91 ns - Tupla de retorno
6.09 ns - Devolver KeyValuePair
2.79 ns - Cargar tupla de la lista
4.18 ns - Cargar KeyValuePair de la lista
KeyValuePair
es una clave y un valor, aTuple<T1,T2>
es solo un par de valores iguales . También puede preguntar: "¿Por qué debería usar unList<Class>
si puedo usarlo?Dictionary<A,B>
".