Переключатель JavaScript, по сравнению с если … еще, если … еще

Парни у меня есть несколько вопросов:

  1. Есть ли различие в производительности в JavaScript между a switch оператор и if...else?
  2. Раз так, почему?
  3. Поведение switch и if...else отличающийся через браузеры? (FireFox, IE, Chrome, Opera, Safari)

Причина того, чтобы задать этот вопрос, кажется, что я получаю лучшую производительность на a switch оператор приблизительно со случаями 1000-х в Firefox.


Отредактированный Unfortuantly это не мой код JavaScript, является произведенной серверной стороной из скомпилированной библиотеки, и у меня нет доступа к коду. Метод, который производит JavaScript, называют

CreateConditionals(string name, string arrayofvalues, string arrayofActions)

примечание: arrayofvalues список разделенных запятой значений.

то, что это производит,

function [name] (value) {
  if (value == [value from array index x]) {
     [action from array index x]
  }
}

Примечание: где [name] = имя передается в функцию серверной стороны

Теперь я изменил вывод функции, которая будет вставлена в TextArea, записал некоторый код JavaScript для парсинга через функцию и преобразовал его в ряд case операторы.

наконец я выполняю функцию, и она хорошо работает, но производительность отличается по IE и Firefox.

131
задан danwellman 19 February 2017 в 13:23
поделиться

7 ответов

Общие ответы:

  1. Да, обычно.
  2. См. Дополнительную информацию здесь
  3. Да, поскольку у каждого из них свой механизм обработки JS, однако при запуске теста на сайте ниже переключатель всегда выполнял if, elseif на большом количестве итераций.

Тестовый сайт

106
ответ дан 24 November 2019 в 00:18
поделиться

Иногда лучше не использовать ни то, ни другое. Например, в ситуации «отправки» Javascript позволяет делать вещи совершенно по-другому:

function dispatch(funCode) {
  var map = {
    'explode': function() {
      prepExplosive();
      if (flammable()) issueWarning();
      doExplode();
    },

    'hibernate': function() {
      if (status() == 'sleeping') return;
      // ... I can't keep making this stuff up
    },
    // ...
  };

  var thisFun = map[funCode];
  if (thisFun) thisFun();
}

Настройка многостороннего ветвления путем создания объекта имеет множество преимуществ. Вы можете динамически добавлять и удалять функции. Вы можете создать таблицу диспетчеризации из данных. Вы можете изучить это программно. Вы можете создавать обработчики с другими функциями.

Есть дополнительные накладные расходы на вызов функции для получения эквивалента «case», но преимущество (когда много случаев) поиска по хешу для поиска функции для определенного ключа.

59
ответ дан 24 November 2019 в 00:18
поделиться

Помимо синтаксиса, переключатель может быть реализован с использованием дерева, которое делает его O (log n) , а if / else должно быть реализовано с процедурным подходом O (n) . Чаще они оба обрабатываются процедурно, и единственная разница заключается в синтаксисе, и, более того, действительно ли это имеет значение - если вы все равно статически не набираете 10 тысяч случаев if / else?

6
ответ дан 24 November 2019 в 00:18
поделиться

Разница в производительности между switch и if...else if...else невелика, в основном они выполняют одну и ту же работу. Одно различие между ними, которое может иметь значение, заключается в том, что проверяемое выражение оценивается только один раз в switch, в то время как оно оценивается для каждого if. Если оценивать выражение дорого, то сделать это один раз, конечно, быстрее, чем сто раз.

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

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

17
ответ дан 24 November 2019 в 00:18
поделиться
  1. Если разница и существует, она никогда не будет достаточно большой, чтобы быть замеченной.
  2. N/A
  3. Нет, все они работают одинаково.

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

6
ответ дан 24 November 2019 в 00:18
поделиться
  1. Верстка может привести к очень небольшим различиям в некоторых случаях, но способ обработки все равно зависит от браузера, так что не стоит беспокоиться
  2. Из-за разных способов обработки
  3. Нельзя называть это браузером, если поведение все равно будет другим
1
ответ дан 24 November 2019 в 00:18
поделиться

Есть ли разница в производительности в Javascript между оператором переключения и if ... else if .... else?

Я так не думаю, переключатель полезен / краток, если вы хотите предотвратить множественные условия if-else .

Поведение переключателя и если ... иначе, если ... еще разное браузеры? (FireFox, IE, Chrome, Opera, Safari)

Поведение одинаково во всех браузерах :)

3
ответ дан 24 November 2019 в 00:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: