Stellen Sie sich den Code vor:
public class obj
{
// elided
}
public static Dictionary<string, obj> dict = new Dictionary<string, obj>();
Methode 1
public static obj FromDict1(string name)
{
if (dict.ContainsKey(name))
{
return dict[name];
}
return null;
}
Methode 2
public static obj FromDict2(string name)
{
try
{
return dict[name];
}
catch (KeyNotFoundException)
{
return null;
}
}
Ich war neugierig, ob es einen Unterschied in der Leistung dieser beiden Funktionen gibt, da die erste langsamer sein sollte als die zweite - da zweimal überprüft werden muss, ob das Wörterbuch einen Wert enthält, während die zweite Funktion nur auf das Wörterbuch zugreifen muss einmal aber WOW, es ist eigentlich umgekehrt:
Schleife für 1 000 000 Werte (mit 100 000 vorhandenen und 900 000 nicht vorhandenen):
erste Funktion: 306 Millisekunden
zweite Funktion: 20483 Millisekunden
Warum ist das so?
BEARBEITEN: Wie Sie in den Kommentaren unter dieser Frage sehen können, ist die Leistung der zweiten Funktion tatsächlich etwas besser als die der ersten, falls 0 nicht vorhandene Tasten vorhanden sind. Sobald jedoch mindestens ein oder mehrere nicht vorhandene Schlüssel vorhanden sind, nimmt die Leistung des zweiten Schlüssels schnell ab.
O(1)Nachschlagen im Wörterbuch ... Zumal das Ausführen von zwei O(1)Operationen immer noch asymptotisch ist O(1).
ContainsKeywird erwartetO(1)...