Benchmark von Java Try / Catch Block

8

Ich weiß, dass der Einstieg in einen catch-Block einige Signifikanzkosten bei der Ausführung eines Programms mit sich bringt, aber ich habe mich gefragt, ob die Eingabe eines try {} -Blocks auch Auswirkungen hatte. Daher habe ich mit vielen Meinungen nach einer Antwort in google gesucht überhaupt kein Benchmarking. Einige Antworten, die ich fand, waren:

  1. Java try / catch-Leistung, wird empfohlen, den Inhalt der try-Klausel auf ein Minimum zu beschränken?
  2. Testen Sie Catch Performance Java
  3. Java try catch blocks

Allerdings haben sie meine Frage nicht mit Fakten beantwortet, also habe ich beschlossen, es selbst zu versuchen.

Folgendes habe ich getan. Ich habe eine CSV-Datei mit diesem Format:

host;ip;number;date;status;email;uid;name;lastname;promo_code;

wo alles nach dem Status optional ist und nicht einmal das entsprechende hat; Wenn also beim Parsen eine Validierung durchgeführt werden muss, um festzustellen, ob der Wert vorhanden ist, kam hier das Problem "Versuch / Fangen" in meinen Sinn.

Der aktuelle Code, den ich in meiner Firma geerbt habe, macht das:

%Vor%

und es wiederholt, was es für E-Mail mit UID, Name, Nachname und Promo_code getan hat.

und ich habe alles zu:

geändert %Vor%

und tatsächlich ist es schneller. Beim Analysieren einer Datei, die nicht die optionalen Spalten enthält. Hier sind die durchschnittlichen Zeiten:

%Vor%

Aber das verwirrt mich und der Grund, warum ich frage: Wenn das Beispiel mit Werten für die optionalen Spalten in allen 8000 Zeilen der CSV ausgeführt wird, ist die if () Version immer noch besser als die try / catch Version. also meine Frage ist

Hat der try-Block wirklich keine Auswirkungen auf die Leistung meines Codes?

Die durchschnittlichen Zeiten für dieses Beispiel sind:

%Vor%

Kann jemand erklären, was hier vor sich geht?

Vielen Dank

    
hectorg87 11.06.2012, 10:36
quelle

1 Antwort

10

Ja, versuchen Sie (in Java) hat keine Auswirkungen auf die Leistung. Der Compiler generiert keine VM-Anweisungen für einen try-Block. Es zeichnet einfach die Programmzähler auf, zwischen denen der try-Block aktiv ist, und fügt diese Informationen an die Methode in der Klassendatei an. Wenn dann eine Ausnahme ausgelöst wird, wickelt die VM den Stapel ab und überprüft bei jedem Rahmen, ob der Programmzähler in diesem Rahmen in einem relevanten Versuchsblock ist. Dies (zusammen mit dem Aufbau der Stack-Spur) ist ziemlich kostspielig, daher ist das Fangen teuer. Versuchen ist jedoch kostenlos:).

Dennoch ist es nicht empfehlenswert, Ausnahmen für den normalen Kontrollfluss zu verwenden.

Der Grund, warum Ihr Code schneller ausgeführt wird, ist wahrscheinlich, dass das Abfangen so extrem kostspielig ist, dass es die Zeit einspart, die durch das Ersetzen des Schecks durch einen einfachen Versuch eingespart wird.

Try Catch kann in Code schneller sein, in dem der Catch nicht sehr oft ausgelöst wird. Wenn Sie beispielsweise 10000 Mal in den try gehen, aber nur einmal fangen, ist die try-Methode schneller als die if-check. Dennoch ist dies kein guter Stil und Ihre Art, explizit nach mehr Tokens zu suchen, ist vorzuziehen.

    
gexicide 11.06.2012, 10:40
quelle

Tags und Links