In Javascript, è costoso utilizzare blocchi try-catch anche se non viene mai lanciata un’eccezione?

È “lento” utilizzare diversi blocchi try-catch quando nessuna eccezione viene lanciata in nessuna di esse? La mia domanda è la stessa di questa , ma per Javascript.

Supponiamo che io abbia 20 funzioni con blocchi try-catch. E un’altra funzione che chiama ognuna di quelle 20 funzioni. Nessuno di loro farà un’eccezione. Il mio codice si esegue più lentamente o si comporta in modo molto peggiore a causa di questi blocchi try-catch?

Stai facendo il tipico codice UI CRUD? Usa try catches, usa loop che vanno a 10000 senza motivo spruzzati nel tuo codice, diavolo, usa angular / ember – non noterai alcun problema di prestazioni.

Se stai facendo una libreria di basso livello, simulazioni fisiche, giochi, lato server ecc, allora il blocco try-catch mai lanciato non conterebbe di certo, ma il problema è che V8 non lo supporta nel loro compilatore di ottimizzazione fino alla versione 6 del motore, quindi l’intera funzione di contenimento che sintatticamente contiene un tentativo di cattura non sarà ottimizzata. Puoi facilmente aggirare questo problema, creando una funzione di supporto come tryCatch :

 function tryCatch(fun) { try { return fun(); } catch(e) { tryCatch.errorObj.e = e; return tryCatch.errorObj; } } tryCatch.errorObj = {e: null}; var result = tryCatch(someFunctionThatCouldThrow); if(result === tryCatch.errorObj) { //The function threw var e = result.e; } else { //result is the returned value } 

Dopo la versione 6 V8 (fornita con Node 8.3 e l’ultima versione di Chrome), le prestazioni del codice all’interno di try-catch sono le stesse del codice normale.

La domanda originale ha chiesto il costo di try / catch quando non è stato generato un errore. C’è sicuramente un impatto quando si protegge un blocco di codice con try / catch, ma l’impatto di try / catch svanirà rapidamente mentre il codice che viene protetto diventa anche leggermente complesso.

Considera questo test: http://jsperf.com/try-catch-performance-jls/2

Un semplice incremento viene eseguito a 356.800.000 iterazioni al secondo Lo stesso incremento in un tentativo / cattura è di 93.500.000 iterazioni al secondo. Si tratta di un sovraccarico del 75% dovuto a try / catch. MA, una banale chiamata di funzione viene eseguita a 112.200.000 iterazioni al secondo. 2 chiamate di funzione banali vengono eseguite a 61.300.000 iterazioni al secondo.

Una prova non esercitata in questo test richiede un tempo leggermente superiore rispetto a una semplice chiamata di funzione. Non è certo una penalità di velocità che conta tranne nel ciclo più interno di qualcosa di veramente intenso come una FFT.

Il caso che si desidera evitare è il caso in cui viene effettivamente generata un’eccezione. Questo è immensamente più lento, come mostrato nel link qui sopra.

Modifica: quei numeri sono per Chrome sulla mia macchina. In Firefox non vi è alcuna differenza significativa tra un tentativo non esercitato e nessuna protezione. C’è praticamente zero penalità nell’usare try / catch se non viene lanciata alcuna eccezione.

Si dice che il blocco try-catch sia costoso. Tuttavia, se le prestazioni critiche non sono un problema, l’utilizzo non è necessariamente un problema.

La sanzione IMO è:

  • leggibilità
  • inappropriato in molti casi
  • inefficace quando si tratta di programmazione asincrona

Leggibilità : scandagliare il tuo codice con un sacco di tentativi di cattura è brutto e distraente

inappropriato : è una ctriggers idea inserire un blocco di questo tipo se il tuo codice non è sobject a crash di eccezioni. Inserirlo solo se si prevede un errore nel codice. Dai un’occhiata al seguente argomento: Quando usare i blocchi try / catch?

Async : il blocco try-catch è sincrono e non è efficace quando si tratta di programmazione async . Durante una richiesta ajax , gestisci sia gli error che gli eventi di success in callback dedicati. Non c’è bisogno di try-catch .

Spero che questo ti aiuti,

R.