2010-07-27 13 views
6

¿La colocación de un bloque try-catch afecta el rendimiento?¿La colocación de un bloque try-catch afecta el rendimiento?

Ejemplo 1: try-catch bloque interior de el bucle while

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

Ejemplo 2: try-catch bloque rodea el bucle while

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

Lógicamente, estos dos ejemplos son equivalentes, pero ¿cuál debería preferir?

+7

Los 2 ejemplos de código no son equivalentes. – krock

+1

Sí, en la segunda situación, ciertamente no desea el 'break;' O su programa no se compilará o saldrá del bucle equivocado. – Phong

+0

Como han notado otros, los ejemplos del código no son equivalentes. Si no estás en un bucle, realmente no puedes frenar de eso. Sin embargo, ¿qué le impide compararse? Es un código bastante simple para comparar. – Wolph

Respuesta

1

Cualquiera que sea el overhead try-catch incurs es probablemente insignificante, pero lo que más llama mi atención con el primer caso es que es engañoso: está atrapando una excepción, solo para abortar el ciclo. Elegiría la solución 2 solo porque es consistente con la intención. Y evitas cualquier sobrecarga de esa manera.

+0

El segundo descanso fue un error de copiar/pegar. –

+1

No dije nada al respecto. Sabía que era un error y lo ignoré porque usted había declarado claramente su intención. – Phong

-1

¿se puede salir de fuera? No creo que su presuposición, que los 2 son equivalentes, sea verdadera.

Mi intuición me dice que la prueba/captura fuera del ciclo es mejor. Si hay un impacto de bytecode escribiendo un try/catch, tener menos creado es mejor. Si no hay impacto a menos que ocurra la excepción, entonces no importa. No veo ninguna circunstancia donde tener el try/catch adentro sería mejor.

podría estar equivocado ...

+0

El segundo descanso fue un error de copiar/pegar. –

3

Should java try blocks be scoped as tightly as possible?

Esto da una respuesta mucho mejor que yo. A falta de eso, solo agregan una entrada a una tabla que se marca cuando se lanzan excepciones, por lo tanto, a menos que se genere una excepción, no afectan el rendimiento. Lo mejor sería simplemente ponerlo donde sea que sea mejor intentar recuperarlo, si es posible. Si no, donde sea que sea útil o tenga sentido. Aunque con un quiebre fuera del ciclo, no creo que el segundo sea válido de todos modos.

+0

El segundo descanso fue un error de copiar/pegar. –

-1

El segundo ejemplo (bloque try-catch que rodea el código) es más rápido y más claro.

0

La colocación de su try-catch no tiene incidencia alguna en el rendimiento de su aplicación. Incluso si lo hiciera, sería completamente insignificante, no es allí donde desea dirigir su energía. Implemente basado en la necesidad primero y luego optimícelo. No micro-optimizar.

Cuestiones relacionadas