Trotz der Semantik kann die Leistung eine wichtige Überlegung sein, wenn Sie beide Optionen in Betracht ziehen. Wie bereits erwähnt, KeyValuePair
ist das ein Werttyp (Struktur), während das Tuple<>
ein Referenztyp (Klasse) ist. Daher wird das KeyValuePair
auf dem Stapel und das Tuple<>
auf dem Heap zugewiesen, und die optimale Auswahl wird normalerweise durch die klassischen Argumente Stack vs. Heap Memory Allocation bestimmt . Kurz gesagt, der Stapelspeicher ist begrenzt, hat aber im Allgemeinen einen sehr schnellen Zugriff. Der Heapspeicher ist viel größer, aber etwas langsamer.
KeyValuePair<T1, T2>
die bessere Wahl sein , wenn sowohl der Schlüssel und Werttypen Primitive sind (Werttypen wie int
, bool
, double
usw.) oder structs von geringer Größe. Mit primitiven Typen auf dem Stapel ist die Zuweisung und Freigabe blitzschnell. Dies kann die Leistung erheblich beeinträchtigen, insbesondere als Argumente für rekursive Methodenaufrufe.
Auf der anderen Seite Tuple<T1, T2>
ist wahrscheinlich die bessere Wahl, wenn entweder T1
oder T2
sind Referenztypen (wie Klassen). A KeyValuePair
, das Zeiger auf Referenztypen (als Schlüssel- oder Werttypen) enthält, macht den Zweck zunichte, da die Objekte ohnehin auf dem Heap nachgeschlagen werden müssen.
Hier ist ein Benchmark, den ich online gefunden habe: Tuple vs. KeyValuePair . Das einzige Problem mit diesem Benchmark ist , dass sie getestet KeyValuePair<string, string>
vs. Tuple<string, string>
und der string
Typ ist eine ungewöhnliche und besondere Art in .NET, dass sie beide wie ein Werttyp verhalten können und / oder einen Referenztyp auf dem Ausführungskontext abhängig. Ich glaube, das KeyValuePair<int, int>
wäre ein klarer Sieger gewesen Tuple<int, int>
. Trotz der Mängel zeigen die Ergebnisse jedoch, dass die Leistungsunterschiede erheblich sein können:
8,23 ns - Tupel zuweisen
0,32 ns - KeyValuePair zuweisen (25x schneller!)
1,93 ns - Tupel als Argument übergeben
2,57 ns - KeyValuePair als Argument übergeben
1,91 ns - Return Tuple
6,09 ns - Return KeyValuePair
2.79 ns - Tupel aus Liste
laden 4.18 ns - KeyValuePair aus Liste laden
KeyValuePair
ist ein Schlüssel und ein Wert, aTuple<T1,T2>
ist nur ein Paar gleicher Werte. Sie könnten auch fragen: "Warum sollte ich ein verwenden,List<Class>
wenn ich verwenden kannDictionary<A,B>
".