答案 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.ceil
和Math.abs
;我猜它们已经过大量优化,所以我怀疑你能通过做一些自己的技巧来获得更好的性能。
结论:你可以更快地做到三件事:
答案 3 :(得分:1)
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