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.
quelle
ContainsKey
wird erwartetO(1)
...O(1)
Nachschlagen im Wörterbuch ... Zumal das Ausführen von zweiO(1)
Operationen immer noch asymptotisch istO(1)
.Antworten:
Einerseits ist das Auslösen von Ausnahmen von Natur aus teuer , da der Stapel abgewickelt werden muss usw.
Andererseits ist der Zugriff auf einen Wert in einem Wörterbuch über seinen Schlüssel billig, da es sich um eine schnelle O (1) -Operation handelt.
Übrigens: Der richtige Weg, dies zu tun, ist zu verwenden
TryGetValue
Dadurch wird nur einmal statt zweimal auf das Wörterbuch zugegriffen.
Wenn Sie wirklich nur zurückkehren möchten,
null
wenn der Schlüssel nicht vorhanden ist, kann der obige Code weiter vereinfacht werden:Dies funktioniert, weil
TryGetValue
Sätzeitem
zu ,null
wenn kein Schlüssel mitname
existiert.quelle
Wörterbücher wurden speziell für die superschnelle Suche nach Schlüsseln entwickelt. Sie werden als Hashtabellen implementiert und je mehr Einträge vorhanden sind, desto schneller sind sie im Vergleich zu anderen Methoden. Die Verwendung der Ausnahme-Engine sollte nur durchgeführt werden, wenn Ihre Methode nicht das getan hat, wofür Sie sie entworfen haben, da es sich um eine große Menge von Objekten handelt, die Ihnen viele Funktionen zur Behandlung von Fehlern bieten. Ich habe einmal eine ganze Bibliotheksklasse mit allem erstellt, was einmal von try catch-Blöcken umgeben war, und war entsetzt, als ich die Debug-Ausgabe sah, die für jede einzelne von über 600 Ausnahmen eine separate Zeile enthielt!
quelle