Вопрос

Я работаю над проектом, который требует довольно сложной обработки JavaScript.Это включает в себя множество вложенных if-elseэто во многих местах.Обычно я старался максимально оптимизировать код JavaScript, читая другие советы по переполнению стека, но мне интересно, будут ли следующие две конструкции иметь какое-либо значение только с точки зрения скорости:

if(some_condition) {
    // process
    return ;
}

// Continue the else condition here

против

if(some_condition) {
    // Process
}

else {
   // The 'else' condition...
}
Это было полезно?

Решение

Я всегда использую первый метод.Читается легче, отступов меньше.Что касается скорости выполнения, это будет зависеть от реализации, но я ожидаю, что они оба будут идентичны.

Другие советы

Во многих языках общепринятой практикой является инвертировать if операторы для уменьшения вложенности или используйте предпосылки.

А меньшее количество вложений в коде повышает читаемость и удобство обслуживания кода.

«Профиль, не спекулируй!»

  1. вы ставите телегу впереди лошади (ремонтопригодность человека превосходит скорость машины)
  2. вам следует активизировать усилия по оптимизации, измерения, что значит

    • вы должны рассчитать время казни самостоятельно;очевидно, что в разных браузерах и версиях он будет отличаться
    • вам следует оптимизировать только скорость горячие точки вашего заявления (см. пункт 1)

Никакой разницы в производительности не будет. Я бы порекомендовал второй пример из соображений удобства обслуживания.В общем, хорошей практикой является наличие одной и только одной возможной точки выхода для процедуры.Это помогает отладке и пониманию.

Я буду использовать первый подход при исключении недопустимых ситуаций.

Например.используйте первый подход при выполнении некоторых проверок и возвращайтесь, если какая-либо проверка не удалась.Нет смысла идти дальше, если какое-либо из предварительных условий не выполнено.То же самое упоминает Мартин Фаулер в своей книге. Рефакторинг книга.Он называет это «заменой условий оговорками охраны».И это действительно может сделать код более простым для понимания.

Вот пример Java.

  public void debitAccount(Account account, BigDecimal amount) {
    if(account.user == getCurrentUser()) {
      if(account.balance > amount) {
           account.balance = account.balance - amount
       } else {
          //return or throw exception
       }
    } else {
        //return or throw exception
    }
  }

ПРОТИВ

 public void debitAccount(Account account, BigDecimal amount) {
    if(account.user != getCurrentUser()) return //or error
    if(account.balance < amount) return //or error
    account.balance = account.balance - amount    
}

Может быть, немного, но я не думаю, что это будет измеримо, если остальная часть функции не будет включать в себя «тяжелые» (и в противном случае избыточные, поскольку я предполагаю, что возврат даст тот же результат) вызовы js.

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

Хотя это зависит от реализации JavaScript в работающем браузере, между ними не должно быть заметной разницы (с точки зрения скорости).

Вторая форма предпочтительнее, поскольку нарушение потока не является хорошей привычкой программирования.Также подумайте о том, что в ассемблере инструкция перехода (микрооперация) всегда оценивается независимо от оценки.

Проверьте это сами.Если этот JavaScript запускается в браузере, он почти наверняка будет зависеть от механизма анализа JavaScript браузера.

Насколько я понимаю, это не будет иметь значения, потому что вы выполняете разветвление с условием if.Таким образом, если some_condition истинно, часть else не будет затронута, даже без возврата.

Предположим, return занимает 1 мс по сравнению с вложенным if занимает 0,1 мс (или наоборот).

Трудно представить, чтобы кто-то из них был настолько медленным.

Теперь вы делаете это более 100 раз в секунду?

Если так, может быть тебя должно это волновать.

Когда есть только один if..else производительность почти такая же и это не имеет значения.Используйте то, что лучше всего читается в вашем случае.Но переходя к вложенным операторам, используя return это самый производительный по сравнению с if...else и case switch

Исходя из моего опыта, это зависит от условия, которое вы проверяете.

  1. if .. return это нормально и легко читается, если вы проверите какое-то логическое условие (возможно, настройку), которое вообще сделает ненужным выполнение всего следующего кода.

  2. if .. else гораздо легче читать, если вы ожидаете, что какое-то значение будет одним из двух (или более) возможных значений, и вы хотите выполнить другой код для обоих случаев.Это означает, что два возможных значения представляют собой условия одинакового интерпретируемого значения и поэтому должны быть записаны на одном логическом уровне.

По моему мнению, return и else аналогичны приведенному выше случаю, но в целом if-else и if()return; очень разные.Вы можете использовать оператор return, если хотите перейти из текущей области в родительскую, а в случае if-else вы можете проверить дальнейшее if-else в той же области.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top