Javascript Math.ceil(Math.abs())优化

时间:2011-01-06 12:12:43

标签: javascript performance optimization bit-manipulation

我在循环中使用Math.ceil( Math.abs( x ) )

任何人都可以实现此操作的任何优化吗? (按位或什么?)

欢迎您在jsperf.com

进行基准测试

6 个答案:

答案 0 :(得分:8)

根据webkit JavaScriptCore

,Math.abs并不简单
case MathObjectImp::Abs:
result = ( arg < 0 || arg == -0) ? (-arg) : arg;

然而,ceil使用C的ceil函数

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

所以测试JSpref http://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;

答案 1 :(得分:3)

x < 0 ? Math.ceil(-x) : Math.ceil(x)在Firefox 3.6中产生了40%的加速(与其他产品差别不大),同时保持相对可读性。

这是jsPerf page。忽略“一些按位运算符”标签;上面的表达式不使用任何。

答案 2 :(得分:2)

Javascript不是像C这样的编译语言,因此可以在这些语言中运行奇迹的按位运算在JS中并不是很好,因为数字存储为64位浮点数。看一下这个SO post

即便如此,您在JS中编写的内容也会被底层浏览器以某种方式转换为本机代码,并且可能更快或更慢,具体取决于实现。

内置了Math.ceilMath.abs;我猜它们已经过大量优化,所以我怀疑你能通过做一些自己的技巧来获得更好的性能。

结论:你可以更快地做到三件事:

  1. JS中的数字表示
  2. 事实上它是一种解释性语言
  3. 您使用的功能是“原生的”,因此它们应该足够快

答案 3 :(得分:1)

根据jsperf

parseInt(Math.abs(x)) + 1在Firefox上的速度提高了约30%

由于参数始终为正,因此Math.ceil()中的分支是不必要的。

答案 4 :(得分:1)

这是另一个,不需要进行任何查找:

((x >= 0 ? x : -x) + 0.5) >> 0

答案 5 :(得分:-1)

两种最快的计算方法(在现代浏览器中提供几乎相同的速度):

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

不同