2010-07-27 9 views
6

Il posizionamento di un blocco try-catch influisce sulle prestazioni?Il posizionamento di un blocco try-catch influenza le prestazioni?

ESEMPIO 1: try-catch blocco all'interno del del ciclo while

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

ESEMPIO 2: try-catch blocco circonda il ciclo while

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

Logicamente, questi due esempi sono equivalenti, ma quale preferisco?

+7

I 2 campioni di codice non sono equivalenti. – krock

+1

Sì, nella seconda situazione certamente non vuoi il 'break;' O il tuo programma non verrà compilato, o uscirai dal ciclo sbagliato. – Phong

+0

Come altri hanno notato, gli esempi di codice non sono equivalenti. Se non sei in un ciclo, non puoi davvero frenare. Indipendentemente da ciò, cosa ti impedisce di analizzarlo? È un codice abbastanza semplice da confrontare. – Wolph

risposta

1

L'eventuale sovraccarico try-catch è probabilmente trascurabile, ma ciò che attira maggiormente la mia attenzione sul primo caso è che è fuorviante: stai rilevando un'eccezione, solo per interrompere il ciclo. Prenderò la soluzione 2 solo perché è coerente con l'intento. E tu eviti qualsiasi sovraccarico in quel modo.

+0

La seconda interruzione è stata un errore da copia/incolla. –

+1

Non ho detto nulla al riguardo. Sapevo che era un errore e l'ho ignorato perché avevi chiaramente dichiarato le tue intenzioni. – Phong

-1

puoi uscire dall'esterno? Non penso che il tuo presupposto, che i 2 siano equivalenti siano veri.

La mia intuizione mi dice che il try/catch al di fuori del ciclo è migliore. Se c'è un impatto bytecode scrivendo un try/catch, avere meno creato è meglio. Se non c'è impatto a meno che non si verifichi l'eccezione, allora non importa. Non vedo alcuna circostanza in cui avere la possibilità di provare/catturare dentro sarebbe meglio.

potrei sbagliarmi ...

+0

La seconda interruzione è stata un errore da copia/incolla. –

3

Should java try blocks be scoped as tightly as possible?

Questo dà una risposta molto meglio di me. In poche parole, aggiungono solo una voce su una tabella che viene controllata quando vengono lanciate eccezioni, quindi, a meno che non venga lanciata un'eccezione, esse non influiscono sul rendimento. Sarebbe meglio metterlo ovunque, dove è meglio cercare di recuperare, se puoi. In caso contrario, dovunque è utile o ha senso. Anche se con pausa fuori dal giro, non penso che il secondo sia comunque valido.

+0

La seconda interruzione è stata un errore da copia/incolla. –

-1

Il secondo esempio (blocco try-catch che circonda il codice) è più veloce e più chiaro.

0

Il posizionamento del tuo try-catch non ha alcuna incidenza sulla performance della tua applicazione. Anche se fosse così, sarebbe del tutto trascurabile, non è qui che vuoi dirigere la tua energia. Implementare innanzitutto in base alle necessità e quindi ottimizzare. Non micro-ottimizzare.

Problemi correlati