Wyobraź sobie kod:
public class obj
{
// elided
}
public static Dictionary<string, obj> dict = new Dictionary<string, obj>();
Metoda 1
public static obj FromDict1(string name)
{
if (dict.ContainsKey(name))
{
return dict[name];
}
return null;
}
Metoda 2
public static obj FromDict2(string name)
{
try
{
return dict[name];
}
catch (KeyNotFoundException)
{
return null;
}
}
Byłem ciekawy, czy jest różnica w wydajności tych 2 funkcji, ponieważ pierwsza POWINNA BYĆ wolniejsza niż druga - biorąc pod uwagę, że musi ona dwukrotnie sprawdzić, czy słownik zawiera wartość, podczas gdy druga funkcja musi mieć dostęp tylko do słownika raz, ale WOW, w rzeczywistości jest odwrotnie:
Pętla dla 1 000 000 wartości (przy 100 000 istniejących i 900 000 nieistniejących):
pierwsza funkcja: 306 milisekund
druga funkcja: 20483 milisekund
Dlaczego?
EDYCJA: Jak można zauważyć w komentarzach pod tym pytaniem, wydajność drugiej funkcji jest w rzeczywistości nieco lepsza niż pierwsza w przypadku, gdy nie ma 0 kluczy. Ale gdy jest co najmniej 1 lub więcej nieistniejących kluczy, wydajność drugiego z nich gwałtownie spada.
O(1)
wyszukiwanie w słowniku ... Zwłaszcza, że wykonywanie dwóch O(1)
operacji jest wciąż asymptotycznie O(1)
.
ContainsKey
oczekuje sięO(1)
...