Anlambilime rağmen, her iki seçeneği de göz önünde bulundurduğunuz için performans önemli bir faktör olabilir. Daha önce bahsedildiği gibi KeyValuePair
, bir değer türüdür (yapı), oysa Tuple<>
bir başvuru türüdür (sınıf). Bu nedenle, KeyValuePair
yığın Tuple<>
üzerinde tahsis edilir ve yığın üzerinde tahsis edilir ve en uygun seçim genellikle Yığın ve Yığın Bellek Tahsisi'nin klasik argümanları tarafından belirlenir . Kısaca, yığın alanı sınırlıdır, ancak genellikle çok hızlı erişime sahiptir. Yığın bellek çok daha büyüktür ancak biraz daha yavaştır.
KeyValuePair<T1, T2>
anahtar ve değer her iki tür de ilkel (değer türleri gibi ise daha iyi olabilir int
, bool
, double
vs.) ya da küçük boyutta yapılar. Yığın üzerindeki ilkel türlerle, ayırma ve ayırma çok hızlıdır. Bu, özellikle özyinelemeli yöntem çağrılarının argümanları olarak performansı gerçekten etkileyebilir.
Öte yandan, referans türlerden biri veya bunlarsa (sınıflar gibi) Tuple<T1, T2>
muhtemelen daha iyi bir seçimdir . Bir (anahtar veya değer türleri gibi) referans türlerine işaretçiler içerir sıralama yenilgilerden nesneler beri amacı zaten öbek üzerinde baktı gerekecektir.T1
T2
KeyValuePair
İşte çevrimiçi bulduğum bir kıyaslama: Tuple ve KeyValuePair . Bu karşılaştırmaya tek sorun onlar test olmasıdır KeyValuePair<string, string>
VS. Tuple<string, string>
ve string
tip bir değer türü ve / veya yürütme bağlama bağlı bir referans türü gibi hem davranabilmesi de .NET alışılmadık ve özel bir türüdür. Bence, KeyValuePair<int, int>
karşı açık bir kazanan olurdu Tuple<int, int>
. Eksikliklerle bile, sonuçlar performans farklılıklarının önemli olabileceğini gösteriyor:
8,23 ns - Tuple Ayır
0,32 ns - KeyValuePair Ayır (25 kat daha hızlı!)
1,93 ns - Tuple'ı bağımsız değişken olarak geçirin
2,57 ns - AnahtarValuePair'i bağımsız değişken olarak geçirin
1,91 ns - Dönüş Tuple
6,09 ns - Dönüş Anahtar Değer Çifti
2.79 ns - Listeden
Tuple'ı Yükle 4.18 ns - Listeden KeyValuePair'i Yükle
KeyValuePair
bir anahtar ve bir değerdir, aTuple<T1,T2>
sadece bir çift eşit değerdir . Ayrıca şunu da sorabilirsiniz: "Kullanabiliyorsam neden aList<Class>
kullanmalıyımDictionary<A,B>
".