Wyobraźmy sobie kod:Dlaczego szybciej jest sprawdzić, czy słownik zawiera klucz, zamiast wychwycić wyjątek na wypadek, gdyby nie był?
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;
}
Method 2
public static obj FromDict2(string name)
{
try
{
return dict[name];
}
catch (KeyNotFoundException)
{
return null;
}
}
Byłem ciekaw, czy istnieje różnica w wydajności tych 2 funkcje, ponieważ pierwszy powinien być WOLNY niż drugi - zważywszy, że musi sprawdź dwa razy, czy słownik zawiera wartość, podczas gdy druga funkcja musi uzyskać dostęp do słownika tylko jeden raz, ale WOW, to jest faktycznie 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 tak jest?
EDYCJA: Jak można zauważyć w komentarzach poniżej tego pytania, wydajność drugiej funkcji jest w rzeczywistości nieco lepsza niż pierwsza, w przypadku gdy istnieje 0 kluczy nie istniejących. Ale gdy istnieje co najmniej jeden nieistniejący klucz, wydajność drugiego szybko maleje.
Dlaczego pierwszy * powinien * być wolniejszy? Właściwie, na pierwszy rzut oka powiedziałbym, że powinien być szybszy, 'ContainsKey' jest oczekiwany' O (1) '... –
http://msdn.microsoft.com/en-us/library/vstudio/ms229009 (v = vs.100) .aspx – Habib
Zobacz http: // stackoverflow.com/a/52390/759019 –