Переключатель Javascript против if ... else if ... else

ребята у меня есть пару вопросов:

  1. есть ли разница в производительности JavaScript между switch заявления и if...else?
  2. если да, то почему?
  3. поведение switch и if...else - разному в разных браузерах? (FireFox, IE, Chrome, Opera, Safari)

причина задавать этот вопрос, кажется, что я получаю лучшую производительность на switch заявление с приблизительно 1000s случаев в Firefox.


редактировать К сожалению, это не мой код, 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] = имя, переданное в функцию serverside

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

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

9 ответов


отвечая в общих чертах:

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

полигоне


иногда лучше использовать не. Например, в ситуации" отправка " 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", но преимущество (когда есть много случаев) хэш-поиска, чтобы найти функцию для конкретного ключа.


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

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

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


  1. Если есть разница, она никогда не будет достаточно большой, чтобы быть замеченным.
  2. N / A
  3. нет, все они функционируют одинаково.

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


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


есть ли разница быстродействия в Javascript между оператором switch и если...иначе, если....еще?

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

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

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


  1. Workbenching может привести к очень небольшим различиям в некоторых случаях, но способ обработки зависит от браузера, так что не стоит беспокоиться
  2. из-за различных способов обработки
  3. вы не можете назвать его браузером, если поведение будет отличаться в любом случае

оказывается, что if-else если вообще быстрее, чем switch

http://jsperf.com/switch-if-else/46


острые это!--10--> предлагает использовать объектный литерал в качестве альтернативы switch или if/else. Мне тоже нравится этот подход, но код в ответе создает новый