[英]Which is faster: Math.abs(value) or value * -1 ?
非常简单,但我只是想知道哪个更快。
我认为简单地将数字乘以-1
比调用预定义方法要快得多,前提是您确定该值为负数。
但如果是这样的话那么abs()
函数是什么? 它是否只是为了确保返回的值始终是正值而不管值的符号?
2012年8月更新 :
我对这些实现进行了一些分析:
/* Test 1: */ b = Math.abs(a);
/* Test 2: */ b = abs(a); //local copy: abs = Math.abs;
/* Test 3: */ b = a < 0 ? a * -1 : a;
/* Test 4: */ b = a < 0 ? -a : a;
我在Windows 7上得到了以下结果。在每个浏览器获得最快结果后,将值标准化,以便更轻松地比较哪种方法更快:
1:Math 2:abs 3:*-1 4:- 1.0= Version
Chrome 1.0 1.0 1.0 1.0 111ms 21.0.1180.75 m
Firefox 1.0 1.0 1.2 1.2 127ms 14.0.1
IE 1.4 1.0 1.1 1.0 185ms 9.0.8112
Opera 1.9 1.6 1.1 1.0 246ms 12.00
Safari 1.6 1.6 1.1 1.0 308ms 5.1.7
结论:当我3年前做过这个测试时,-a是最快的,但现在Math.abs(x)在Firefox中更快! 在Chrome中, abs(a)
和-a
得到相同的时间,当我用10 000 000个数字测试它时,与最慢的方法只有3毫秒的差异。
我的建议 :使用Math.abs(a) 。 如果你处于紧密循环中并且通过分析发现它太慢,你可以使用对abs函数的本地引用:
var abs=Math.abs; //A local reference to the global Math.abs function
for (i=0;i<1234567890;++i) if ( abs( v[i] ) > 10) ++x;
我建议选择更清楚地表明你的意图的方法,而不是担心性能。 在这种情况下,乘以-1的性能增益可能是最小的。
当您使用Math.abs()
,很明显您需要一个正值。 当您使用* -1
它不清楚,需要更多调查以确定输入值是否始终为负。
我想这取决于实现,但Math.abs
可以简单到:
function abs(x) {
return x < 0 ? x * -1 : x;
}
所以,从理论上讲,它只是在乘法之前增加了一个快速测试。
但是,是的,否定负号只是唯一的目的。 关键是简单的x * -1
对正值也适得其反。
@olliej [评论]
真正。 但是,简单编辑。 ;)
function abs(x) {
return Number(x < 0 ? x * -1 : x);
}
只是*-1
操作可能更快,但请记住,最终结果与 math.abs()的结果不同 。
math.abs(-5)
和math.abs(5)
都返回5。
-5 * -1
返回5。
5 * -1
返回-5。
因此,除非您完全确定该数字是否为负数,否则您必须进行一些测试,这会耗费更多时间。 不妨做math.abs()。
但实际上,如果你的JS中abs()和* -1之间的性能差异很重要,那么你可能会遇到更严重的问题。
风格问题:为什么使用a * -1
而不是-a
? 除此之外,如果您事先不知道号码的标志,我同意您应该使用abs()
。 我不关心速度,但是为了可读性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.