[英]Javascript Math.ceil(Math.abs()) optimization
根据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.ceil
和Math.abs
是建立在; 我猜它们已经过大量优化,所以我怀疑你可以通过自己的一些技巧来获得更好的性能。
一句话:三个方面阻碍你更快地做到这一点:
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.