Dalam Javascript, lebih mahal untuk menggunakan try-catch blok bahkan jika pengecualian ini tidak pernah dibuang?

Itu "lambat" untuk menggunakan beberapa try-catch blok ketika tidak ada pengecualian dilemparkan di salah satu dari mereka? Pertanyaan saya adalah sama seperti yang ini, tetapi untuk Javascript.

Misalkan saya memiliki 20 fungsi yang telah mencoba menangkap blok mereka. Dan fungsi lain yang memanggil setiap orang 20 fungsi. Tidak satupun dari mereka akan melempar pengecualian. Saya akan mengeksekusi kode yang lebih lambat atau melakukan jauh lebih buruk karena try-catch blok?

Mengomentari pertanyaan (8)
Larutan

Yang anda lakukan khas CRUD kode UI? Penggunaan mencoba menangkap, gunakan loop yang pergi ke 10000 tanpa alasan ditaburi dalam kode anda, neraka, menggunakan sudut/bara - anda tidak akan melihat adanya masalah kinerja.

Jika anda melakukan tingkat rendah perpustakaan, fisika, simulasi, permainan, server-side dll maka tidak pernah melemparkan try-catch blok tidak't biasanya peduli sama sekali tapi masalahnya adalah bahwa V8 didn't mendukung dalam mengoptimalkan compiler sampai versi 6 dari mesin, agar seluruh fungsi yang berisi bahwa sintaksis mengandung mencoba menangkap tidak akan optimal. Anda dapat dengan mudah mengatasi hal ini meskipun, dengan membuat fungsi pembantu seperti 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
}

Setelah V8 versi 6 (dikirim dengan Node 8.3 dan Chrome terbaru), kinerja dari kode di dalam coba-menangkap adalah sama seperti yang normal kode.

Komentar (5)

Asli pertanyaan yang diajukan tentang biaya try/catch ketika kesalahan itu tidak dilemparkan. Pasti ada dampak ketika melindungi blok kode dengan mencoba menangkap, namun dampak dari try/catch akan lenyap dengan cepat sebagai kode dilindungi bahkan menjadi sedikit kompleks.

Pertimbangkan tes ini: http://jsperf.com/try-catch-performance-jls/2

Sederhana increment berjalan di 356,800,000 iterasi per detik Sama kenaikan hanya coba/tangkap adalah 93,500,000 iterasi per detik. Yang's pada overhead dari 75% karena try/catch. TAPI, sepele panggilan fungsi berjalan pada 112,200,000 iterasi per detik. 2 sepele fungsi panggilan dijalankan pada 61,300,000 iterasi per detik.

Un dilaksanakan coba di tes ini membutuhkan sedikit waktu lebih dari satu sepele fungsi panggilan. Yang's hampir kecepatan penalti yang penting kecuali dalam batin-paling loop dari sesuatu yang benar-benar intens seperti FFT.

Kasus yang ingin anda hindari adalah kasus di mana pengecualian adalah benar-benar dibuang. Yang sangat lambat, seperti yang ditunjukkan pada link di atas.

Edit: angka-angka untuk Chrome di komputer saya. Di Firefox tidak ada perbedaan yang signifikan antara unexercised mencoba dan tidak ada perlindungan sama sekali. Ada's pada dasarnya nol penalti untuk menggunakan try/catch jika tidak ada pengecualian dilemparkan.

Komentar (3)

Coba-menangkap block dikatakan mahal. Namun jika kinerja yang penting adalah tidak menjadi masalah, menggunakan hal ini tidak selalu menjadi perhatian.

Hukuman IMO adalah:

  • pembacaan
  • tidak pantas dalam banyak kasus
  • tidak efektif ketika datang untuk async pemrograman

Mudah dibaca: pipa kode anda dengan banyak mencoba menangkap jelek dan mengganggu

tidak pantas: it's merupakan ide yang buruk untuk menyisipkan blok tersebut jika kode anda tidak tunduk pada pengecualian-kecelakaan. Masukkan hanya jika anda mengharapkan kegagalan dalam kode anda. Lihat topik berikut: https://stackoverflow.com/questions/1722964/when-to-use-try-catch-blocks

Async: try-catch blok sinkron dan tidak efektif ketika datang untuk async pemrograman. Selama ajax permintaan anda menangani kedua kesalahan dan sukses acara khusus di callback. Tidak perlu untuk coba-menangkap.

Semoga ini bisa membantu,

R.

Komentar (5)