поведение. Возможно, вы должны принять самый лучший ответ, а не свой собственный.

ользуюMath.ceil( Math.abs( x ) ) внутри петли.

Кто-нибудь может реализовать какую-либо оптимизацию для этой операции? (Поразрядно или как?)

Добро пожаловать в тест наjsperf.com

 Christoph06 янв. 2011 г., 13:52
@Crozin: есть накладные расходы на поиск и вызов функций (динамическая диспетчеризация), от которых вы можете избавиться, используя только операторы (статическая диспетчеризация)
 Dan06 янв. 2011 г., 13:18
PS: мне нужно возвращаемое значение операции, а не условие, что это <или> что-то
 Nathan MacInnes06 янв. 2011 г., 13:25
Боюсь, это не становится проще, чем ты это сделал.
 OrangeDog06 янв. 2011 г., 13:38
Я изменил тестовое значение на отрицательное с плавающей точкой вместо целого числа, так что код на самом деле должен что-то делать.
 Crozin06 янв. 2011 г., 13:50
Из того, что я вижу в источниках WebKit, методы JavaScriptMath.abs() а такжеMath.ceil() использовать C ++ функции cmathfabs() а такжеceil(), Я действительно не думаю, что вы могли бы оптимизировать это. Вы уверены, что это проблема? Не могли бы вы опубликовать код, который вы используете?

Ответы на вопрос(6)

x < 0 ? Math.ceil(-x) : Math.ceil(x) обеспечивает Firefox 3.6 ускорение на 40% (небольшая разница в других), оставаясь при этом относительно читабельным.

Здесьстраница jsPerf, Игнорировать метку "некоторые побитовые операторы"; Выражение выше не использует ничего.

 starwed03 мар. 2013 г., 22:09
I найдено с помощью jsperf в этом случае выполнение некоторых побитовых вещей быстрее, чем функция потолка.
 Amjad Masad06 янв. 2011 г., 13:48
Та же скорость на Chrome

как C, поэтому побитовые операции, которые могут творить чудеса на таких языках, не так хороши в JS, потому что числа хранятся как 64-битные числа с плавающей запятой. Взгляните на этоТАК сообщение.

Даже в этом случае то, что вы пишете в JS, будет каким-то образом преобразовано в собственный код с помощью основного браузера, и это может быть быстрее или медленнее, в зависимости от реализации.

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

Итог: три вещи стоят на вашем пути, чтобы сделать это быстрее:

представление чисел в JSтот факт, что это интерпретированный языкиспользуемые вами функции являются «нативными», поэтому они должны быть достаточно быстрыми сами по себе
 Christoph06 янв. 2011 г., 13:59
вы забываете о накладных расходах - использование операторов вместо методов скорее всего ускорит код
 gsnedders16 янв. 2011 г., 01:34
Хотя, по-видимому, в JS все числа являются двойными, все движки JS на самом деле хранят значения в целых числах, когда это возможно, поэтому побитовые операторы все еще быстры, поскольку преобразование не требуется, если число уже является целым числом.

инаковую скорость в современных браузерах):

function f (n) {
   return (~~n) + 1;
}

// or 

function f1 (n) {
   return (n | 0) + 1;
}

// some tests, ~~ operator seems to work identicaly on numbers:

( 3.3 | 0 ) === 3;   
( 3.8 | 0 ) === 3;   
( -3.3 | 0 ) === -3; 
( -3.8 | 0 ) === -3;  

в отличиеMath.floor(-3.3) == Math.floor(-3.8) == -4

 MikeM09 мая 2014 г., 22:37
f1(1); // 2. Эти функции не следуютMath.ceil поведение. Возможно, вы должны принять самый лучший ответ, а не свой собственный.
Решение Вопроса

Math.abs не становится проще в соответствии с webkit JavaScriptCore

case MathObjectImp::Abs:
result = ( arg < 0 || arg == -0) ? (-arg) : arg;

Однако ceil использует функцию ceil C

 case MathObjectImp::Ceil:
    result = ::ceil(arg);

поэтому тестирование на JSprefhttp://jsperf.com/math-ceil-vs-bitwise побитовый быстрее
тестирование @ orangedog ответhttp://jsperf.com/math-ceil-vs-bitwise/2 Math.ceil быстрее

Поэтому я думаю, что ваш лучший выбор:

var n = Math.abs(x);
var f = (n << 0),
f = f == n ? f : f + 1;
 Dan27 мар. 2013 г., 17:32
Недурно, вы провели большое исследование в источнике Webkit!

parseInt(Math.abs(x)) + 1 По словам jsperf, на Firefox он работает примерно на 30% быстрее

Поскольку аргумент всегда положительный, ветви в Math.ceil () не нужны.

 OrangeDog06 янв. 2011 г., 14:58
Ах, хорошая мысль. Проверка на это, что неудивительно, снова замедляет работу.
 annakata06 янв. 2011 г., 13:43
Это может быть или не быть быстрее, но это также неправильно - любое число с дробным компонентом с нулевым значением будет неправильно на 1 больше, чем значение ceil'd.

Вот еще один, который не нужно искать:

((x >= 0 ? x : -x) + 0.5) >> 0
 Dan15 янв. 2011 г., 13:10
 MikeM09 мая 2014 г., 20:29
Округление здесьMath.round неMath.ceil.

Ваш ответ на вопрос