Terlepas dari semantiknya, kinerja mungkin menjadi pertimbangan penting saat Anda mempertimbangkan kedua opsi tersebut. Seperti yang disebutkan sebelumnya, KeyValuePair
adalah tipe nilai (struct), sedangkan Tuple<>
adalah tipe referensi (kelas). Oleh karena itu, the KeyValuePair
dialokasikan di stack dan Tuple<>
dialokasikan di heap, dan pilihan optimal biasanya ditentukan oleh argumen klasik Stack vs. Heap Memory Allocation . Singkatnya, ruang tumpukan terbatas, tetapi umumnya memiliki akses yang sangat cepat. Memori heap jauh lebih besar tetapi agak lebih lambat.
KeyValuePair<T1, T2>
mungkin menjadi pilihan yang lebih baik jika kedua kunci dan nilai jenis yang primitif (jenis nilai seperti int
, bool
, double
, dll) atau struct dari ukuran kecil. Dengan tipe primitif pada stack, alokasi dan deallocation sangat cepat. Ini benar-benar dapat memengaruhi performa, terutama sebagai argumen untuk panggilan metode rekursif.
Di sisi lain, Tuple<T1, T2>
kemungkinan adalah pilihan yang lebih baik jika salah satu T1
atau T2
tipe referensi (seperti kelas). A KeyValuePair
yang berisi pointer ke jenis referensi (sebagai kunci atau tipe nilai) semacam mengalahkan tujuan karena objek tetap perlu dicari di heap.
Ini patokan yang saya temukan secara online: Tuple vs. KeyValuePair . Satu-satunya masalah dengan tolok ukur ini adalah bahwa mereka menguji KeyValuePair<string, string>
vs. Tuple<string, string>
, dan string
tipenya adalah tipe yang tidak biasa dan khusus dalam .NET yang dapat berperilaku seperti tipe nilai dan / atau tipe referensi tergantung pada konteks eksekusi. Saya yakin itu KeyValuePair<int, int>
akan menjadi pemenang yang jelas melawan Tuple<int, int>
. Meskipun terdapat kekurangan, namun, hasilnya menunjukkan bahwa perbedaan kinerja dapat menjadi signifikan:
8,23 ns - Alokasikan Tuple
0,32 ns - Alokasikan KeyValuePair (25x lebih cepat!)
1,93 ns - Lewati Tuple sebagai argumen
2,57 ns - Lulus KeyValuePair sebagai argumen
1,91 ns - Kembali Tuple
6,09 ns - Kembalikan KeyValuePair
2.79 ns - Muat Tuple dari Daftar
4.18 ns - Muat KeyValuePair dari Daftar
KeyValuePair
adalah kunci dan nilai, aTuple<T1,T2>
hanyalah sepasang nilai yang sama . Anda juga bisa bertanya: "mengapa saya harus menggunakanList<Class>
jika saya dapat menggunakanDictionary<A,B>
".