2010-07-27 3 views
6

Beeinflusst die Platzierung eines try-catch-Blocks die Leistung?Beeinträchtigt die Platzierung eines try-catch-Blocks die Leistung?

BEISPIEL 1: try-catch Block Innenseite die while-Schleife

while (true) { 
    try { 
     // ... read from a file 
    } catch (EOFException e) { 
     break; 
    } 
} 

Beispiel 2: try-catch Block

die while-Schleife umgibt
try { 
    while (true) { 
     // ... read from a file 
    } 
} catch (EOFException e) { 
    // :P 
} 

Logisch, diese zwei Beispiele sind gleichwertig, aber welche sollte ich bevorzugen?

+7

Die 2 Codebeispiele sind nicht gleichwertig. – krock

+1

Ja in der zweiten Situation willst du sicher nicht die 'break;' Entweder wird dein Programm nicht kompilieren, oder du wirst aus der falschen Schleife ausbrechen. – Phong

+0

Wie andere bemerkt haben, sind die Codebeispiele nicht gleichwertig. Wenn Sie nicht in einer Schleife sind, können Sie nicht wirklich davon abbremsen. Was hält Sie jedoch davon ab, das Benchmarking durchzuführen? Es ist ein ziemlich einfacher Code zum Benchmarking. – Wolph

Antwort

1

Was auch immer Overhead try-catch verursacht ist wahrscheinlich vernachlässigbar, aber was zieht meine Aufmerksamkeit mehr mit dem ersten Fall ist, dass es irreführend ist: Sie fangen eine Ausnahme, nur um die Schleife abzubrechen. Ich würde Lösung 2 wählen, nur weil es mit der Absicht übereinstimmt. Und Sie vermeiden jeden Overhead auf diese Weise.

+0

Die zweite Pause war ein Fehler beim Kopieren/Einfügen. –

+1

Ich habe dazu nichts gesagt. Ich wusste, dass es ein Fehler war und ignorierte es, weil du deine Absicht klar ausgesprochen hattetest. – Phong

-1

können Sie von außerhalb der Weile brechen? Ich glaube nicht, dass deine Annahme, dass die 2 gleich sind, wahr ist.

Meine Intuition sagt mir, dass der Versuch/Fang außerhalb der Schleife besser ist. Wenn es einen Bytecode-Einfluss gibt, indem ein try/catch geschrieben wird, ist es besser, weniger erstellt zu haben. Wenn es keine Auswirkungen gibt, außer die Ausnahme tritt auf, ist das egal. Ich sehe keine Umstände, bei denen es besser wäre, den Versuch/Fang innen zu haben.

Ich könnte falsch sein ...

+0

Die zweite Pause war ein Fehler beim Kopieren/Einfügen. –

3

Should java try blocks be scoped as tightly as possible?

Daraus ergibt sich eine viel bessere Antwort als ich konnte. Kurz gesagt, sie fügen nur einen Eintrag zu einer Tabelle hinzu, die überprüft wird, wenn Ausnahmen ausgelöst werden. Wenn also keine Ausnahme ausgelöst wird, wirkt sich dies nicht auf die Leistung aus. Es ist am besten, es einfach dort zu platzieren, wo es am besten ist, es zu versuchen, wenn du kannst. Wenn nicht, wo immer nützlich oder sinnvoll. Obwohl mit Pause außerhalb der Schleife, glaube ich nicht, dass die zweite sowieso gültig ist.

+0

Die zweite Pause war ein Fehler beim Kopieren/Einfügen. –

-1

Das zweite Beispiel (try-catch-Block um der Code) ist sowohl schneller als auch klarer.

0

Die Platzierung Ihres Try-Catch hat keinerlei Auswirkungen auf die Leistung Ihrer Anwendung. Selbst wenn dies der Fall wäre, wäre das völlig vernachlässigbar. Das ist nicht der Ort, an dem du deine Energie lenken möchtest. Implementieren Sie basierend auf dem Bedarf zuerst und optimieren Sie dann. Nicht optimieren.