Парни у меня есть несколько вопросов:
switch
оператор и if...else
? 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.
Общие ответы:
Иногда лучше не использовать ни то, ни другое. Например, в ситуации «отправки» 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», но преимущество (когда много случаев) поиска по хешу для поиска функции для определенного ключа.
Помимо синтаксиса, переключатель может быть реализован с использованием дерева, которое делает его O (log n)
, а if / else должно быть реализовано с процедурным подходом O (n)
. Чаще они оба обрабатываются процедурно, и единственная разница заключается в синтаксисе, и, более того, действительно ли это имеет значение - если вы все равно статически не набираете 10 тысяч случаев if / else?
Разница в производительности между switch
и if...else if...else
невелика, в основном они выполняют одну и ту же работу. Одно различие между ними, которое может иметь значение, заключается в том, что проверяемое выражение оценивается только один раз в switch
, в то время как оно оценивается для каждого if
. Если оценивать выражение дорого, то сделать это один раз, конечно, быстрее, чем сто раз.
Разница в реализации этих команд (и всего скрипта в целом) в разных браузерах довольно велика. Часто можно наблюдать довольно большие различия в производительности одного и того же кода в разных браузерах.
Поскольку вы вряд ли сможете протестировать производительность всего кода во всех браузерах, вам следует выбирать тот код, который лучше всего подходит для того, что вы делаете, и стараться уменьшить объем выполняемой работы, а не оптимизировать то, как она выполняется.
В общем, используйте то, что делает код наиболее читабельным. Определенно есть места, где одна или другая конструкция делает код более чистым, более читаемым и более удобным для сопровождения. Это гораздо важнее, чем, возможно, экономия нескольких наносекунд в коде JavaScript.
Есть ли разница в производительности в Javascript между оператором переключения и if ... else if .... else?
Я так не думаю, переключатель
полезен / краток, если вы хотите предотвратить множественные условия if-else
.
Поведение переключателя и если ... иначе, если ... еще разное браузеры? (FireFox, IE, Chrome, Opera, Safari)
Поведение одинаково во всех браузерах :)