Nonostante la semantica, le prestazioni possono essere una considerazione importante se si considerano entrambe le opzioni. Come accennato in precedenza, il KeyValuePair
è un tipo di valore (struct), mentre il Tuple<>
è un tipo di riferimento (classe). Pertanto, il KeyValuePair
è allocato sullo stack e il Tuple<>
è allocato sull'heap, e la scelta ottimale è solitamente determinata dai classici argomenti di Stack vs Heap Memory Allocation . In breve, lo spazio dello stack è limitato, ma generalmente ha un accesso molto veloce. La memoria heap è molto più grande ma è leggermente più lenta.
KeyValuePair<T1, T2>
può essere la scelta migliore se sia la chiave e il valore tipi sono primitive (tipi di valore preferito int
, bool
, double
, ecc) o strutture di piccole dimensioni. Con i tipi primitivi in pila, l'allocazione e la deallocazione sono velocissime. Questo può davvero influire sulle prestazioni, soprattutto come argomenti per chiamate di metodi ricorsive.
D'altra parte, Tuple<T1, T2>
è probabilmente la scelta migliore se uno T1
o due T2
sono tipi di riferimento (come le classi). Un tipo KeyValuePair
che contiene puntatori a tipi di riferimento (come i tipi di chiave o valore) vanifica lo scopo poiché gli oggetti dovranno essere cercati comunque nell'heap.
Ecco un benchmark che ho trovato online: Tuple vs. KeyValuePair . L'unico problema con questo benchmark che hanno testato KeyValuePair<string, string>
contro Tuple<string, string>
, e il string
tipo è un tipo insolito e speciale in NET in quanto può comportarsi sia come un tipo di valore e / o un tipo di riferimento a seconda del contesto di esecuzione. Credo che KeyValuePair<int, int>
sarebbe stato un chiaro vincitore contro Tuple<int, int>
. Anche con le carenze, tuttavia, i risultati mostrano che le differenze di prestazioni possono essere significative:
8.23 ns - Alloca tupla
0.32 ns - Alloca KeyValuePair ( 25 volte più veloce!)
1.93 ns - Passa Tuple come argomento
2.57 ns - Passa KeyValuePair come argomento
1.91 ns - Restituisci tupla
6.09 ns - Restituisci KeyValuePair
2.79 ns - Carica tupla dalla lista
4.18 ns - Carica KeyValuePair dalla lista
KeyValuePair
è una chiave e un valore, aTuple<T1,T2>
è solo una coppia di valori uguali . Potresti anche chiedere: "perché dovrei usare aList<Class>
se posso usareDictionary<A,B>
".