Ребята, у меня есть пара вопросов:
- Есть ли разница в производительности между JavaScript
switch
и операторомif...else
? - Если так, то почему?
- Является ли поведение
switch
иif...else
отличается в разных браузерах? (FireFox, IE, Chrome, Opera, Safari)
Причина, по которой я задаю этот вопрос, заключается в том, что мне кажется, что я получаю более высокую производительность в switch
заявлении с примерно 1000-ю случаями в Firefox.
К сожалению, это не мой код, 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]
= имя, переданное в функцию сервера
Теперь я изменил вывод функции для вставки в TextArea, написал некоторый код JavaScript для анализа функции и преобразовал его в набор case
операторов.
наконец, я запускаю функцию, и она работает нормально, но производительность отличается в IE и Firefox.
источник
Ответы:
Отвечая в общих чертах:
Тестовый сайт
источник
switch
иif/then
операторами в JS ничтожна . В статье утверждается, что это происходит из-за неоднозначнойswitch
оптимизации и различных способов работы различных движков JS. Цитата:Since most JavaScript engines don’t have such optimizations, performance of the switch statement is mixed.
Иногда лучше не использовать ни того, ни другого. Например, в ситуации «отправки» Javascript позволяет вам делать вещи совершенно по-другому:
Настройка многократного ветвления путем создания объекта имеет много преимуществ. Вы можете добавлять и удалять функции динамически. Вы можете создать таблицу отправки из данных. Вы можете проверить это программно. Вы можете создавать обработчики с другими функциями.
Есть дополнительные издержки вызова функции, чтобы получить эквивалент «case», но преимущество (когда есть много случаев) поиска хеша для поиска функции для определенного ключа.
источник
Разница в производительности между a
switch
иif...else if...else
мала, в основном они выполняют одну и ту же работу. Одно из различий между ними, которое может иметь значение, состоит в том, что проверяемое выражение оценивается только один раз, иswitch
оно вычисляется для каждогоif
. Если оценивать выражение стоит дорого, то, конечно, делать это один раз быстрее, чем сто раз.Разница в реализации этих команд (и всего сценария в целом) довольно сильно отличается в разных браузерах. Часто встречаются большие различия в производительности одного и того же кода в разных браузерах.
Поскольку вы вряд ли сможете протестировать производительность всего кода во всех браузерах, вам следует выбрать код, который лучше всего подходит для того, что вы делаете, и попытаться уменьшить объем выполненной работы, а не оптимизировать ее работу.
источник
В основном, используйте то, что делает код наиболее читабельным. Определенно есть места, где та или иная конструкция делает ее более чистой, удобочитаемой и удобной в обслуживании. Это намного важнее, чем сохранение нескольких наносекунд в коде JavaScript.
источник
if..else
иswitch
вызванные уникальным сочетанием компьютерной версии браузера и ОС.Помимо синтаксиса, переключение может быть реализовано с использованием дерева, которое его создает
O(log n)
, тогда как if / else должно быть реализовано сO(n)
процедурным подходом. Чаще всего они обрабатываются процедурно, и единственное различие заключается в синтаксисе, и, кроме того, это действительно имеет значение - разве вы в любом случае статически набираете 10 000 случаев if / else?источник
Ответ Пойнти предполагает использование литерала объекта в качестве альтернативы
switch
илиif
/else
. Мне тоже нравится этот подход, но код в ответе создает новыйmap
объект каждый раз, когдаdispatch
вызывается функция:Если
map
содержит большое количество записей, это может привести к значительным накладным расходам. Лучше настроить карту действий только один раз, а затем каждый раз использовать уже созданную карту, например:источник
Я так не думаю,
switch
полезно / коротко, если вы хотите предотвратить несколькоif-else
состояний.Поведение одинаково во всех браузерах :)
источник
switch is useful/short if you want prevent multiple if-else conditions.
Да, сэр, отличный пост.источник
Оказывается, если-иначе, если вообще быстрее, чем переключатель
http://jsperf.com/switch-if-else/46
источник