我在循环中使用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,使用位运算比使用Math.ceil更快。位运算更快。
测试@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;
Math.ceil
和Math.abs
是内置的,我猜想它们已经得到了大力优化,所以我怀疑您是否能通过自己的一些技巧来获得更好的性能。parseInt(Math.abs(x)) + 1
在 Firefox 上比 jsperf 测试快约30%
由于参数始终为正,因此 Math.ceil() 中的分支是不必要的。
这里还有一个不需要进行任何查找的例子:
((x >= 0 ? x : -x) + 0.5) >> 0
Math.round
而不是 Math.ceil
。 - MikeM进行计算的两种最快方法(在现代浏览器中几乎具有相同的速度):
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
不同
Math.ceil
的行为。也许你应该接受最高评分的答案,而不是你自己的答案。 - MikeM
Math.abs()
和Math.ceil()
使用了C++ cmath函数fabs()
和ceil()
。我真的不认为你可以对其进行优化。你确定这是一个问题吗?你能贴出你正在使用的代码吗? - Crozin