Переключатель Javascript vs. if... else if... else

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

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

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


Edited К сожалению, это не мой код, Javascript создается сервером из компилируемой библиотеки, и у меня нет доступа к этому коду. Метод, создающий javascript, называется

CreateConditionals(string name, string arrayofvalues, string arrayofActions)

note arrayofvalues - список, разделенный запятой.

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

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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

Является ли поведение переключателя и если... else if... else different браузеры? (FireFox, IE, Chrome, Opera, Сафари)

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

Ответ 7

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

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();
}

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

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

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

function dispatch( name ) {
    var action = actions[name];
    if( action ) action();
}

Ответ 8

  • В некоторых случаях workbenching может привести к очень небольшим различиям, но способ обработки зависит от браузера, поэтому не стоит беспокоиться
  • Из-за разных способов обработки
  • Вы не можете называть его браузером, если поведение будет иным образом