Pomimo semantyki wydajność może być ważnym czynnikiem, biorąc pod uwagę obie opcje. Jak wcześniej wspomniano, KeyValuePair
jest typem wartości (struct), podczas gdy Tuple<>
jest typem referencyjnym (klasą). W związku z tym KeyValuePair
alokacja jest przydzielana na stosie, a Tuple<>
na stercie, a optymalny wybór jest zwykle określany przez klasyczne argumenty alokacji pamięci stosu względem sterty. . Krótko mówiąc, przestrzeń w stosie jest ograniczona, ale ogólnie ma bardzo szybki dostęp. Pamięć sterty jest znacznie większa, ale jest nieco wolniejsza.
KeyValuePair<T1, T2>
może być lepszym wyborem, jeśli zarówno klucz i wartość typy są prymitywy (typy wartości podoba int
, bool
, double
, itd.) lub elemencie małej wielkości. Przy typach prymitywnych na stosie alokacja i zwalnianie przydziałów przebiega błyskawicznie. Może to naprawdę wpłynąć na wydajność, zwłaszcza jako argumenty wywołań metod rekurencyjnych.
Z drugiej strony Tuple<T1, T2>
jest prawdopodobnie lepszym wyborem, jeśli jeden z typów referencyjnych T1
lub T2
są to typy referencyjne (takie jak klasy). A, KeyValuePair
który zawiera wskaźniki do typów referencyjnych (jako typy klucza lub typy wartości), pokonuje cel, ponieważ obiekty i tak będą musiały być wyszukiwane na stercie.
Oto test porównawczy, który znalazłem online: Tuple vs. KeyValuePair . Jedynym problemem związanym z tym testem porównawczym jest to, że testowali je w KeyValuePair<string, string>
porównaniu Tuple<string, string>
z string
typem , a typ jest nietypowym i specjalnym typem w .NET, ponieważ może zachowywać się zarówno jak typ wartości i / lub typ referencyjny w zależności od kontekstu wykonania. Uważam, że KeyValuePair<int, int>
byłby wyraźnym zwycięzcą przeciwko Tuple<int, int>
. Jednak nawet przy niedociągnięciach wyniki pokazują, że różnice w wydajności mogą być znaczące:
8.23 ns - Allocate Tuple
0.32 ns - Allocate KeyValuePair (25x szybciej!)
1,93 ns - Przekaż krotkę jako argument
2,57 ns - Przekaż KeyValuePair jako argument
1,91 ns - Return Tuple
6.09 ns - Return KeyValuePair
2.79 ns - Załaduj krotkę z listy
4.18 ns - Załaduj KeyValuePair z listy
KeyValuePair
to klucz i wartość, aTuple<T1,T2>
to tylko para równych wartości. Możesz także zapytać: „dlaczego powinienem używać,List<Class>
jeśli mogę użyćDictionary<A,B>
”.