2013-11-18 3 views
-2

Я использую Math.abs для моих 1000 пунктов нижели Math.abs занимает больше времени, чтобы выполнить в JavaScript

Math.abs(a - b) < tolerance; 

Мой профайлер показывает, что Math.abs использует 62 мс, мне нужно, чтобы оптимизировать его , поэтому попытался это

((a-b) < 0 ?-(a-b) : a-b) < tolerance; 

Я хочу знать, что лучше и быстро

+2

Является ли это настоящим узким местом ** в вашем приложении? – aga

+1

Попробуйте протестировать его! Вы уже написали код, так почему вы спрашиваете здесь? –

+1

@aga Кажется, что этот код работает 1000 раз. Так что да, это может быть проблема с производительностью. –

ответ

0

это сильно зависит от браузера (и версии) используется, как вы можете видеть в этом 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 бит.

Надеюсь, это поможет!

Смежные вопросы