Java-try-catch-Blöcke
Hier eine einfache Frage :
Was haltet Ihr von code, die die Verwendung try catch für jede Anweisung ?
void myfunction() {
try {
instruction1();
}
catch (ExceptionType1 e) {
//some code
}
try {
instruction2();
}
catch (ExceptionType2 e) {
//some code
}
try {
instruction3();
}
catch (ExceptionType3 e) {
//some code
}
try {
instruction4();
}
catch (ExceptionType4 e) {
//some code
}
//etc
}
Ich weiß, dass ist schrecklich, aber ich will wissen ob das die Leistung abnimmt.
- Wenn Sie wissen möchten, ob dass die Leistung abnimmt, Messen Sie es! Es gibt zu viele Faktoren, um eine definitive Antwort geben (Ihre JVM, hardware-Plattform, wie zeitaufwendig sind solche
instructionX
Anrufe, ob Ausnahmen tatsächlich geworfen bekommen). - möglich, Duplikat der Java try/catch-Leistung, wird es empfohlen, um zu halten, was innerhalb des try-Klausel auf ein minimum reduzieren?
- Die Leistung decrese ist minimal, aber Sie könnte einen hohen Preis zahlen müssen, da Sie eingeführt haben, die mehrfache Ausführung Weg. Wenn exception 1 wird ausgelöst, und Sie behandeln es, dann Ausnahme 2 bekommen könnte geworfen. Es hängt tatsächlich davon ab, Ihre business-Logik ( soll die Ausführung unterbrochen werden, wenn eine der exception wird geworfen oder nicht). Aber die Leistung ist nicht ein Problem mit Ihrem code.
- dein code-Beispiel ist irreführend... Was Sie sich beziehen, als "Anleitung" geschrieben wird, als ob es war immer eine Methode aufrufen. Hast du gedacht, "was denkst du, Was der code mit try/catch um jeden Methodenaufruf?" Da würd ich sicher noch mehr Dinge zu sagen, die Verpackung Anweisungen wie int a = 42; in einem try/catch 😉
- Wird dies nie schaffen einen spürbaren Rückgang in der Leistung
Du musst angemeldet sein, um einen Kommentar abzugeben.
Probieren Sie etwas wie dieses: (ich weiß, das beantwortet nicht deine Frage, aber es ist sauberer)
Es nicht die Leistung verringern (sicherlich nicht spürbar), aber es ist in der Tat schrecklich Aussehen.
Denken Sie an die goldene Regel: lesbarer code ist oft schneller code. Produzieren lesbaren code erste und nur das ändern, wenn es erweist sich als zu langsam.
Gruppe Ihre try-catch-Blöcken in logische Abschnitte der original-code (Z. B. für die Eröffnung eines stream und Lesen von Daten aus es, eine für alle die Verarbeitung erfolgt danach) und die Wartungs-Entwickler wird es Ihnen danken.
Sollten Sie auch Bedenken, dass, wenn Sie Ihre erste catch-block abfangen einer Ausnahme nicht abrupt beenden (das ist, dass die Ausführung weiterhin im normalen Fluss), weitere Ausnahmen kann geworfen werden, die durch die nachfolgenden Anweisungen, die sich auf die vorherigen erfolgreich abgeschlossen, beide sind unechte und Sie können langsam Ihre code unten.
Nein, dies ist wahrscheinlich nicht die Leistung verringern (aber, wie immer, Sie müssten, um es zu testen). Bei der Kompilierung in bytecode, der Java-exception-Handler geändert werden in eine Tabelle der bytecode-offset-Bereiche und zugehörige handler-Adressen. Die catch-Handler sind in der Regel zusammengestellt, die außerhalb des mainline-code, also nicht beeinflussen "normalen" nicht-Ausnahme-Ausführung.
Mehr Informationen finden Sie in Der Java Virtual Machine Specification, Abschnitt 7.12 auslösen und behandeln von Ausnahmen. Dieser Abschnitt enthält auch Beispiele dafür, wie verschiedene code-Konstrukte werden könnte kompiliert zum bytecode.
Verwendung von übermäßigen Mengen von
try-catch
können Sie beginnen, werden hinsichtlich der Leistung teuer, wenn Ausnahmen geworfen werden. Sie wäre besser dran, entweder nicht mit so vielen Ausnahmen geprüft oder alle Ihre ExceptionTypes erweitern einer Allgemeinen Exception-Basisklasse. Auf diese Weise können Sie einen einzigen try-catch, das ist viel einfacher zu Lesen und hat eine bessere Leistung.Wie Sie sehen können aus diese Antwort, die Leistung trifft es minimal, es sei denn, es wird ein Fehler geworfen.