В JavaScript, это дорого, чтобы использовать try-catch блоки, даже если исключение не бросается?

Это ее "медленно", чтобы использовать несколько попробовать-catch блоки при отсутствии исключений в любом из них? Мой вопрос такой же, как этот, но для JavaScript.

Предположим, у меня есть 20 функций, которые попробовать-catch блоки в них. И еще одна функция, которая вызывает каждый из этих 20 функций. Никто из них не будет бросать исключение. Будет ли мой код выполняться медленнее или гораздо хуже из-за этого попробовать-catch блоки?

Комментарии к вопросу (8)
Решение

Вы делаете типичную код пользовательского интерфейса фигня? Использовать try ловит, используйте петли, которые идут до 10000 без повода сыпал в коде ад, использовать угловые/Эмбер - вы не заметите никаких проблем с производительностью.

Если вы делаете низкий уровень библиотека, физика, моделирование, игры, серверные и т. д., то никогда не бросали попробовать-catch блок не'т, как правило, дело вообще, но проблема в том, что В8 не'т поддерживать его в их оптимизации компилятора до версии 6 двигателя, поэтому весь, содержащий функцию, которая синтаксически содержит попробовать ловить не будет оптимизирован. Вы можете легко хотя обойти это, создав вспомогательную функцию как 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
}

После версии V8 6 (поставляется с узлом 8.3 и последний хром), производительности код внутри `попробовать-поймать-это же, что и обычный код.

Комментарии (5)

Первоначальный вопрос о стоимости попробовать/поймать, когда ошибка не была брошена. Существует, безусловно, влияет, когда защита блока кода с try/поймать, но влияние попробовать/поймать быстро исчезают как защищен код становится даже немного сложный.

Рассмотрим этот тест: http://jsperf.com/try-catch-performance-jls/2

Простой инкремент выполняется при итерациях 356,800,000 в секунду И ту же величину в попробовать/поймать 93,500,000 итераций в секунду. Что's на накладные расходы 75% из-за попробовать/поймать. Но, банальный вызов функции работает на 112,200,000 итераций в секунду. 2 тривиальные вызовы функции запустить на 61,300,000 итераций в секунду.

ООН осуществляла попробовать в этом тесте занимает немного больше времени, чем один банальный вызов функции. Что'с трудом скоростью наказание, что имеет значение разве что в самый внутренний цикл чего-то очень сильно, как БПФ.

В случае, если вы хотите, чтобы избежать случай-это исключение фактически брошены. Это очень медленнее, так как показано на ссылке выше.

Редактировать: эти цифры для хрома на моей машине. В Firefox нет существенной разницы между нетренированного попробовать и никакой защиты. Там'ы по существу ноль казнь с использованием попробовать/поймать, если никакое исключение не выдается.

Комментарии (3)

`Попробовать-поймать блок считается дорогим. Однако если данные показатели не проблема, используя это не обязательно проблема.

Штраф ИМО:

  • читабельность
  • во многих случаях неподходящим
  • неэффективными, когда дело доходит до асинхронного программирования

Читабельность: сантехника код с большим количеством попробовать-поймать-это некрасиво и отвлекает

неуместно: это'ы плохая идея, чтобы вставить такой блок, если код не подлежит исключение-аварии. Вставить ее только если вы ожидаете неудачи в коде. Взгляните на следующие темы: https://stackoverflow.com/questions/1722964/when-to-use-try-catch-blocks

Асинхронность: попробовать-поймать блок синхронно и не эффективны, когда дело доходит до асинхронного программирования. Во время "Аяксом" просим вас обрабатывать как ошибка и успех событий в специальных обратных вызовов. Нет необходимости для `попробовать-поймать.

Надеюсь, что это помогает,

Р.

Комментарии (5)