Gibt es eine bessere Möglichkeit, eine Cast-Ausnahme zu behandeln?

8

Betrachten Sie die folgende Funktion:

%Vor%

Parameter

  • inputString: Was wir evaluieren wollen
  • checkString: Das Kriterium (Wert), das die Eingabe für
  • auswerten muss
  • Operator: Geben Sie die Operation an, die wir ausführen möchten

Andere Dinge zu wissen

  • Jede Zeile in einer Datei wird anhand dieser Methode ausgewertet, die zurückgegeben werden soll, wenn eine Bedingung erfüllt wurde
  • Der Prozess der Auswertung der Datensätze in der Datei überprüft Zeile für Zeile, in einem Fall, dass es gleich der Bedingung ist. Es kann auch prüfen, ob dieselbe Zeile auch größer als die Bedingung ist. Sobald die Prüfungen abgeschlossen sind, wird zum nächsten Datensatz
  • gewechselt
  • Es sind keine zusätzlichen Ereignis-Listener angeschlossen, außer den Standardeinstellungen. Ich dränge keine zusätzlichen Daten in Debug- oder Trace-Protokolle

Problem

Was die Leute bewerten werden, ist mir zu keinem Zeitpunkt in diesem Prozess bekannt, aber ich muss in der Lage sein zu überprüfen, dass etwas (egal was) gleich, größer oder kleiner als etwas anderes ist. Sicher, ich überprüfe andere Dinge, aber ich habe diese Funktion sehr vereinfacht.

Das heißt, die Verwendung von EQUAL oder NOT_EQUAL läuft so schnell wie möglich, wobei Datensätze in einer sehr großen Datei gegen die genannten Kriterien ziemlich schnell und effizient verarbeitet werden. Sobald ich die GREATER_THAN-Logik hinzugefügt habe, ist es langsam ... bis zu dem Punkt, an dem es 20 Minuten dauert, 20-Megabyte-Dateien zu verarbeiten, die früher eine halbe Minute in Anspruch nahmen.

Von dem, was ich sagen kann:

  • Ausnahmen werden überall verteilt. Es gibt keine Garantie, dass ein Feld numerisch oder vom Typ Datum sein wird. Also muss ich versuchen, auf diese Datentypen umzustellen, um zu versuchen, die Bedingung
  • auszuwerten
  • Wenn Ausnahmen ausgelöst werden, wird die Konsole dort ausgegeben, wo ich sie nicht angewiesen habe, ihre Art von automatisiertem

Ja, ich habe einen Mangel an Erfahrung in diesem Bereich und möchte mehr über die Ausnahmebehandlung erfahren und was wirklich hinter den Kulissen passiert, denn wenn die anderen 80% der Datensätze nicht numerisch sind, sind das viele Ausnahmen in einer 20 meg, 80 Tausend Datei aufnehmen.

Gibt es einen besseren Weg, den Cast selbst zu handhaben, um die Effizienz zu erhöhen? Ich habe double.Parse / TryParse gesehen und kann direkt vorbestimmen aber bin mir nicht sicher was am meisten nützt.

    
Mohgeroth 11.05.2011, 23:03
quelle

4 Antworten

8

Sie können TryParse () für diese Datentypen verwenden. Ausnahmen sind unordentlich und teuer. TryParse gibt true / false zurück, wenn es funktionierte oder nicht, während es keine Ausnahme auslöst. So können Sie einfach die Ergebnisse des Anrufs überprüfen. Viel effizienter als Ausnahmen.

Convert.ToDouble () und Double.Parse () werden Ausnahmen auslösen.

probiere diesen Code. Es ist nicht das Beste, aber es ist besser als das, was du jetzt denkst, weil du nicht weißt, was der Typ sein könnte:

%Vor%     
Dustin Davis 11.05.2011, 23:06
quelle
11

Verwenden Sie double.TryParse und DateTime.TryParse anstelle von Convert.ToDouble und DateTime .Parse .

Beispiel:

%Vor%     
dtb 11.05.2011 23:07
quelle
2

Beachten Sie, dass die Verwendung von Ausnahmen Ihr Programm verlangsamt, da die Laufzeitumgebung im Hintergrund einen Ausnahme-Stack erstellt, um diesen im Falle einer Ausnahme abschalten zu können. Dieser Stapel wird beibehalten, unabhängig davon, ob das Programm ausgelöst wird oder nicht, und dieser Overhead verlangsamt Sie am meisten.

    
Gustavo Mori 11.05.2011 23:31
quelle
0

Die anderen Antworten sind wahrscheinlich die beste Lösung in diesem Fall, aber im allgemeinen Fall können Sie Ihre Lösung verbessern, indem Sie die spezifische Ausnahme abfangen, die wahrscheinlich NumberFormatException oder ClassCastException ist. Catching Exception kann alle Arten von lästigen, schwer zu verfolgenden Problemen verursachen (da Sie die Ausnahme nicht protokollieren).

    
Brendan Long 12.05.2011 03:07
quelle

Tags und Links