это сильно зависит от браузера (и версии) используется, как вы можете видеть в этом jsperf и обсуждается в related question on SO:
Anno 2013 можно констатировать, что:
Math.abs()
в основном быстрый в IE, FireFox и Safari
- побитовое
(x^(x >> 31)) - (x >> 31)
в основном быстрый в Chrome и Operah
- троичной
(x < 0 ? -x : x)
только самый быстрый в FireFox 3.x и 4 эры.
Вы можете предоставить динамический функциональный загрузчик, чтобы инициировать оптимальную функцию (основанную на поточном профилировании в реальном времени или обнаружении браузера), содержащую самую быструю процедуру для этого браузера.
Естественно, это происходит за пару затрат:
- времени тратится на браузер профилировании (надежность при загрузке страницы) или браузер-обнаружении (а, надежности в целом ..)
- дополнительной пропускной способности для увеличения Javascript
- (обычно) больше памяти след (поскольку на лету генерируются функции часто медленнее, чем статические определенные функции (которые даны надлежащего Indentifier)
Так что в целом я бы предпочел:
Mah.abs()
(так как это часто является наименьшим и четко указывает на намерение).
Вслед за тройкой (часто в сочетании с запятой, с помощью которой я могу выполнять больше логики только с одним тестом, это может быть как быстрее, так и короче и даже требует меньше логики программирования).
Наконец, побитовый вариант показывает наименьшее намерение, не предлагает некоторые из вышеуказанных тройных преимуществ. И работает только надежно, если у вас не более 32 бит.
Надеюсь, это поможет!
Является ли это настоящим узким местом ** в вашем приложении? – aga
Попробуйте протестировать его! Вы уже написали код, так почему вы спрашиваете здесь? –
@aga Кажется, что этот код работает 1000 раз. Так что да, это может быть проблема с производительностью. –