Переключатель на JavaScript и если...еще, если...еще


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

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

причина, по которой я задаю этот вопрос, кажется, что я получаю лучшую производительность на switch заявление с приблизительно 1000 случаев в 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 103

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

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

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

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

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

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

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

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

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