Kodu hayal edin:
public class obj
{
// elided
}
public static Dictionary<string, obj> dict = new Dictionary<string, obj>();
Yöntem 1
public static obj FromDict1(string name)
{
if (dict.ContainsKey(name))
{
return dict[name];
}
return null;
}
Yöntem 2
public static obj FromDict2(string name)
{
try
{
return dict[name];
}
catch (KeyNotFoundException)
{
return null;
}
}
Bu 2 işlevin performansında bir fark olup olmadığını merak ettim, çünkü birincisi ikincisinden daha YAVAŞ OLMALIDIR - sözlüğün bir değer içerip içermediğini iki kez kontrol etmesi gerektiğinden, ikinci işlevin yalnızca sözlüğe erişmesi gerekir bir kez ama WOW, aslında tam tersi:
1000 000 değer için döngü (100 000 mevcut ve 900 000 mevcut değil):
ilk fonksiyon: 306 milisaniye
ikinci fonksiyon: 20483 milisaniye
Neden?
DÜZENLEME: Bu sorunun altındaki yorumlarda da görebileceğiniz gibi, mevcut olmayan anahtarların olması durumunda ikinci işlevin performansı aslında birinciden biraz daha iyidir. Ancak en az 1 veya daha fazla mevcut olmayan anahtar olduğunda, ikincisinin performansı hızla düşer.
O(1)
, sözlükteki aramadan çok daha fazla talimat var ... Özellikle iki O(1)
işlem yapmak hala asimptotik olduğundan O(1)
.
ContainsKey
, bekleniyorO(1)
...