繁体   English   中英

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

[英]Javascript Math.ceil(Math.abs()) optimization

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

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

欢迎您在jsperf.com进行基准测试

根据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;

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

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

Javascript不是像C这样的编译语言,因此在这些语言中可以创造奇迹的按位运算在JS中并不是那么好,因为数字存储为64位浮点数。 看看这篇SO帖子

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

由于Math.ceilMath.abs是建立在; 我猜它们已经过大量优化,所以我怀疑你可以通过自己的一些技巧来获得更好的性能。

一句话:三个方面阻碍你更快地做到这一点:

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

parseInt(Math.abs(x)) + 1在Firefox上快了大约30%

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM