JavaScript: оператор `if/else` быстрее, чем условный оператор?

Рассмотрим следующие два фрагмента кода:

var adj=0>grip.y?0<grip.x?0:-180:0<grip.x?-360:-180;

а также

var adj;    
if (grip.y < 0) {   
    if (grip.x > 0)
        adj = 0;
    else
        adj = -180;
}
else {      
    if (grip.x > 0)
        adj = -360;
    else
        adj = -180;
}

Они оба дают одинаковый результат, но что быстрее?


person Andrei Oniga    schedule 17.10.2012    source источник
comment
Микрооптимизация, не беспокойтесь. Если хотите, создайте эталон на jsperf.com.   -  person Rob W    schedule 17.10.2012
comment
разница будет практически нулевой, используйте более читаемый.   -  person richardtz    schedule 17.10.2012
comment
Ваш первый условный оператор называется тернарным оператором.   -  person N_A    schedule 17.10.2012
comment
Они оба реализованы как ветвь, если условие истинно. Никакой разницы в производительности. Но только один читается легче. Угадайте, какой?   -  person Amir Raminfar    schedule 17.10.2012
comment
Второй более ремонтопригоден, что должно быть приоритетом. Также рассмотрите возможность использования констант вместо жестко заданных числовых значений, таких как -360. Например, var CIRCLE_DEGREES = 360.   -  person Dave Jarvis    schedule 17.10.2012
comment
Зачем использовать константы в этом случае?   -  person Andrei Oniga    schedule 17.10.2012
comment
если по какой-то причине вы переключитесь на радианы, просто выполните «переименование», затем измените значение, и все в порядке...   -  person GameAlchemist    schedule 17.10.2012
comment
Исходя из идеи создать бенчмарк я сделал на jsperf.com. jsperf.com/if-vs-conditional/2. И действительно, результаты незначительны (по крайней мере, в моем случае), но что более интересно, они различаются в зависимости от используемого браузера.   -  person Andrei Oniga    schedule 17.10.2012


Ответы (3)


Разница в скорости будет незначительной — используйте то, что вам кажется более удобным и читаемым. Не будет никаких проблем с неправильной условной конструкцией.

person Rahul Tripathi    schedule 17.10.2012
comment
Я знаю, что между ними тоже есть небольшая разница, но я заинтересован в оптимизации обработчика событий mousemove, поэтому чем меньше операций, тем лучше (очевидно). - person Andrei Oniga; 17.10.2012
comment
@AndreiOniga Я действительно думаю, что такая разница будет. Все зависит от вашего удобства. Пожалуйста, перейдите по этой ссылке quirksmode.org/js/events_mouse.html. Я бы порекомендовал if else или тернарный оператор в соответствии с вашим удобством. В ссылке также есть несколько примеров (в конце), которые могут вам ответить. :) - person Rahul Tripathi; 17.10.2012
comment
Признаюсь, во многих ситуациях я предпочитаю использовать if...else просто для ясности. - person Rahul Tripathi; 17.10.2012

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

person Nevin Madhukar K    schedule 25.11.2013

Просто для проверки производительности в JavaScript я попытался провести небольшой эксперимент.

console.time("ternary operator");
const val = (5 > 2) ? true : false;
console.log(val);
console.timeEnd("ternary operator");

console.time("if condition");
let val2;
if (5 > 2) {
val2 = true;
} else {
val2 = false;
}
console.log(val2)

console.timeEnd("if condition");

и вывод весьма шокирует, так как условие if почти в два раза быстрее, чем троичные операторы.

Результаты: - введите здесь описание изображения

Итак, в заключение я бы предложил использовать условие if вместо тернарного оператора.

person Ganpat Kakar    schedule 02.11.2020
comment
Вы также рассчитываете время печати, которая намного дороже, особенно по сравнению с постоянным условием, которое следует оптимизировать во время JIT. Второй вызов console.log, вероятно, намного быстрее после того, как первый разогреет его. (И у ЦП есть шанс разогнаться до максимального турбо, если это Skylake или более поздняя версия, которая может отреагировать за это время.) Идиоматический способ оценки производительности? покрывает это - попробуйте поменять местами эти две вещи и посмотреть, всегда ли вторая быстрее. - person Peter Cordes; 02.11.2020
comment
Вам нужен более сложный тест, если вы хотите получить значимые результаты. Например, Почему обработка отсортированного массива выполняется быстрее, чем обработка несортированного массива?, где условие непостоянно. - person Peter Cordes; 02.11.2020
comment
@PeterCordes Что ж, похоже, вы правы, я обычно не выдвигаю гипотезу о том, что процессор находится в том или ином состоянии, я пытаюсь запустить программу несколько раз (один за другим), наблюдаю за выходными данными и беру среднее значение но похоже, что на этот раз, когда я попытался запустить обе программы по отдельности, чтобы избежать конфликта между обоими их процессами, я обнаружил, что оба данных почти одинаковы. Спасибо, что заставили меня изучить это еще раз, и это сломало одно из моих представлений о том, что условие if работает быстрее, чем тернарные операторы. Спасибо - person Ganpat Kakar; 02.11.2020
comment
Хорошо взять среднее значение (или отбросить выбросы и выбрать лучшее воспроизводимое время для каждой версии). Но да, если ваша методология ошибочна, вы просто повторяете ту же ошибку. Микробенчмаркинг — это сложно. Это просто для вещей, которые работают достаточно долго, чтобы скрыть накладные расходы на измерение / прогрев, и даже тогда можно не измерять то, что вы думали, или чрезмерно обобщать результаты (например, пропускная способность и задержка - это разные вещи; некоторые способы бенчмаркинга будет зависеть от того или иного.) - person Peter Cordes; 02.11.2020