Meine Anwendung liest eine Excel-Datei mit VSTO und fügt die gelesenen Daten zu a hinzu StringDictionary
. Es werden nur Daten hinzugefügt, bei denen es sich um Zahlen mit wenigen Ziffern handelt (1000 1000,2 1000,34 - Komma ist ein Trennzeichen in russischen Standards).
Was ist besser, um zu überprüfen, ob die aktuelle Zeichenfolge eine geeignete Nummer ist?
object data, string key; // data had read
try
{
Convert.ToDouble(regionData, CultureInfo.CurrentCulture);
dic.Add(key, regionData.ToString());
}
catch (InvalidCastException)
{
// is not a number
}
oder
double d;
string str = data.ToString();
if (Double.TryParse(str, out d)) // if done, then is a number
{
dic.Add(key, str);
}
Ich muss StringDictionary
anstelle von Dictionary<string, double>
wegen der folgenden Parsing-Algorithmus Probleme verwenden.
Meine Fragen: Welcher Weg ist schneller? Welches ist sicherer?
Und ist es besser anzurufen Convert.ToDouble(object)
oder Convert.ToDouble(string)
?
Antworten:
Ich habe einen schnellen, nicht wissenschaftlichen Test im Release-Modus durchgeführt. Ich habe zwei Eingaben verwendet: "2.34523" und "badinput" in beide Methoden und 1.000.000 Mal iteriert.
Gültige Eingabe:
Nicht viel anders als erwartet. Für gültige Eingaben sind diese in jeder Hinsicht gleich.
Ungültige Eingabe:
Nun ... es lief lange. Ich habe das Ganze mit 1.000 Iterationen wiederholt und
Convert.ToDouble
bei schlechten Eingaben 8,3 Sekunden gebraucht . Im Durchschnitt würde es über 2 Stunden dauern. Es ist mir egal, wie grundlegend der Test ist. Im ungültigen Eingabefall wirdConvert.ToDouble
das Auslösen von Ausnahmen Ihre Leistung beeinträchtigen.Also, hier ist eine weitere Abstimmung
TryParse
mit einigen Zahlen, um dies zu belegen.quelle
Zunächst würde ich
double.Parse
eher alsConvert.ToDouble
in erster Linie verwenden.Ob Sie verwenden sollten
Parse
oderTryParse
: Können Sie fortfahren, wenn schlechte Eingabedaten vorliegen, oder ist dies eine wirklich außergewöhnliche Bedingung? Wenn es außergewöhnlich ist, verwendenParse
Sie es und lassen Sie es explodieren, wenn die Eingabe schlecht ist. Wenn es erwartet wird und sauber gehandhabt werden kann, verwenden SieTryParse
.quelle
In den Entwurfsrichtlinien für .NET Framework wird die Verwendung der Try-Methoden empfohlen. Ausnahmen zu vermeiden ist normalerweise eine gute Idee.
Convert.ToDouble(object)
Wird besorgt((IConvertible) object).ToDouble(null);
Welches wird anrufen
Convert.ToDouble(string, null)
Es ist also schneller, die String-Version aufzurufen.
Die String-Version macht jedoch nur Folgendes:
So geht es schneller
double.Parse
direkt.quelle
Wenn Sie die Ausnahme nicht behandeln möchten, wählen Sie TryParse. TryParse ist schneller, da es nicht den gesamten Exception-Stack-Trace verarbeiten muss.
quelle
Ich versuche im Allgemeinen, die
Convert
Klasse zu meiden (was bedeutet: Ich benutze sie nicht), weil ich sie sehr verwirrend finde: Der Code gibt zu wenig Hinweise darauf, was genau hier passiert, daConvert
viele semantisch sehr unterschiedliche Konvertierungen mit demselben Code möglich sind . Dies macht es für den Programmierer schwierig zu kontrollieren, was genau passiert.Mein Rat ist daher, diese Klasse niemals zu verwenden. Es ist auch nicht wirklich notwendig (außer für die binäre Formatierung einer Zahl, da die normale
ToString
Methode der Zahlenklassen keine geeignete Methode dafür bietet).quelle
Sofern Sie nicht zu 100% sicher sind, was selten der Fall ist, sollten Sie Double.TryParse verwenden.
Die Geschwindigkeit der Analyse wird zweitrangig, wenn Sie eine Ausnahme auslösen, da es nicht viel langsamer als eine Ausnahme gibt.
quelle
Viel Hass für die Convert-Klasse hier ... Nur um ein wenig auszugleichen, gibt es einen Vorteil für Convert - wenn Sie ein Objekt erhalten,
kann den Wert einfach zurückgeben, wenn o bereits ein Double ist (oder ein int oder etwas leicht umsetzbares).
Die Verwendung von Double.Parse oder Double.TryParse ist großartig, wenn Sie es bereits in einer Zeichenfolge haben, aber
muss gehen, um die Zeichenfolge zuerst zu analysieren und abhängig von Ihrer Eingabe, die teurer sein könnte.
quelle
Convert.ToSomething()
ist so viel teurer als Parse / TryParse, besonders in einem IterationskontextDouble.TryParse IMO.
Es ist einfacher für Sie zu handhaben. Sie wissen genau, wo der Fehler aufgetreten ist.
Dann können Sie damit umgehen, wie Sie es für richtig halten, wenn es false zurückgibt (dh nicht konvertieren konnte).
quelle
Ich habe es immer vorgezogen, die
TryParse()
Methoden zu verwenden, weil sie den Erfolg oder Misserfolg der Konvertierung zurückspucken werden, ohne sich um Ausnahmen sorgen zu müssen.quelle
Dies ist eine interessante alte Frage. Ich füge eine Antwort hinzu, weil niemand ein paar Dinge mit der ursprünglichen Frage bemerkt hat.
Was ist schneller: Convert.ToDouble oder Double.TryParse? Was ist sicherer: Convert.ToDouble oder Double.TryParse?
Ich werde diese beiden Fragen im Detail beantworten (ich werde die Antwort später aktualisieren), aber zuerst:
Aus Sicherheitsgründen hat jeder Programmierer in dieser Frage die Zeile (Hervorhebung von mir) übersehen:
Gefolgt von diesem Codebeispiel:
Interessant ist hier: Wenn die Tabellen im russischen Zahlenformat vorliegen, Excel die Zellenfelder jedoch nicht korrekt eingegeben hat, wie werden die aus Excel eingegebenen Werte richtig interpretiert?
Hier ist eine weitere interessante Sache zu den beiden Beispielen in Bezug auf die Geschwindigkeit:
Dies wird wahrscheinlich MSIL erzeugen, das so aussieht:
In diesem Sinne können wir wahrscheinlich die Gesamtzahl der von jedem Programm ausgeführten MSIL-Anweisungen vergleichen - dazu später mehr, wenn ich diesen Beitrag aktualisiere.
Ich glaube, Code sollte korrekt, klar und schnell sein ... In dieser Reihenfolge!
quelle
Persönlich finde ich die
TryParse
Methode leichter zu lesen. Welche Sie tatsächlich verwenden möchten, hängt von Ihrem Anwendungsfall ab: Wenn Fehler lokal behandelt werden können, erwarten Sie Fehler und ein Bool vonTryParse
ist gut, andernfalls möchten Sie vielleicht einfach lassen Die Ausnahmen fliegen.Ich würde erwarten, dass das
TryParse
auch schneller ist, da es den Aufwand für die Ausnahmebehandlung vermeidet. Verwenden Sie jedoch ein Benchmark-Tool wie die MiniBench von Jon Skeet , um die verschiedenen Möglichkeiten zu vergleichen.quelle