Bayangkan kodenya:
public class obj
{
// elided
}
public static Dictionary<string, obj> dict = new Dictionary<string, obj>();
Metode 1
public static obj FromDict1(string name)
{
if (dict.ContainsKey(name))
{
return dict[name];
}
return null;
}
Metode 2
public static obj FromDict2(string name)
{
try
{
return dict[name];
}
catch (KeyNotFoundException)
{
return null;
}
}
Saya ingin tahu apakah ada perbedaan kinerja 2 fungsi ini, karena yang pertama HARUS lebih lambat dari yang kedua - mengingat bahwa perlu memeriksa dua kali jika kamus berisi nilai, sedangkan fungsi kedua hanya perlu mengakses kamus saja sekali tetapi WOW, sebenarnya berlawanan:
Ulangi untuk 1 000 nilai nilai (dengan 100.000 ada dan 900.000 tidak ada):
fungsi pertama: 306 milidetik
fungsi kedua: 20483 milidetik
Mengapa demikian?
EDIT: Seperti yang Anda lihat dalam komentar di bawah pertanyaan ini, kinerja fungsi kedua sebenarnya sedikit lebih baik daripada yang pertama jika ada 0 kunci yang tidak ada. Tetapi begitu ada setidaknya 1 atau lebih kunci tidak ada, kinerja yang kedua menurun dengan cepat.
c#
performance
dictionary
Petr
sumber
sumber
ContainsKey
diharapkanO(1)
...O(1)
mencari di kamus ... Terutama karena melakukan duaO(1)
operasi masih asimptotikO(1)
.Jawaban:
Di satu sisi, pengecualian melempar pada dasarnya mahal , karena tumpukan harus dibatalkan dll.
Di sisi lain, mengakses nilai dalam kamus dengan kuncinya adalah murah, karena itu adalah operasi yang cepat, O (1).
BTW: Cara yang benar untuk melakukan ini adalah menggunakan
TryGetValue
Ini mengakses kamus hanya sekali, bukan dua kali.
Jika Anda benar-benar ingin kembali saja
null
jika kunci tidak ada, kode di atas dapat disederhanakan lebih lanjut:Ini berfungsi, karena
TryGetValue
diaturitem
kenull
jika tidak ada kunci denganname
ada.sumber
Kamus secara khusus dirancang untuk melakukan pencarian kunci super cepat. Mereka diimplementasikan sebagai tagar dan semakin banyak entri semakin cepat relatif terhadap metode lain. Menggunakan mesin pengecualian hanya seharusnya dilakukan ketika metode Anda gagal melakukan apa yang Anda rancang untuk dilakukan karena itu adalah seperangkat objek besar yang memberi Anda banyak fungsi untuk menangani kesalahan. Saya membangun seluruh kelas perpustakaan sekali dengan segala sesuatu yang dikelilingi oleh coba tangkap blok sekali dan terkejut melihat hasil debug yang berisi baris terpisah untuk setiap satu dari lebih dari 600 pengecualian!
sumber