我在循环中使用Math.ceil( Math.abs( x ) )。
有人能为这个操作实现任何优化吗?(按位还是别的什么?)
欢迎您在jsperf.com上进行基准测试
发布于 2011-01-06 20:41:56
根据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;发布于 2011-01-06 20:42:55
在保持相对可读性的同时,x < 0 ? Math.ceil(-x) : Math.ceil(x)在Firefox3.6中产生了40%的加速(其他的差别很小)。
这是jsPerf page。忽略“一些按位运算符”标签;上面的表达式没有使用任何运算符。
发布于 2011-01-06 20:33:28
Javascript不像C那样是一种编译语言,所以在这种语言中可以创造奇迹的按位操作在JS中就不是那么好了,因为数字是以64位浮点形式存储的。看看这个SO post。
即使到那时,您用JS编写的代码也会被底层浏览器以某种方式转换为本机代码,并且可能更快,也可能更慢,具体取决于实现。
由于Math.ceil和Math.abs都是内置的,我猜它们都经过了深度优化,所以我怀疑您是否能够通过自己的一些技巧来获得更好的性能。
底线:有三件事会阻碍你更快地完成任务:
JS中的
,所以它们在自己的上应该足够快。
https://stackoverflow.com/questions/4614768
复制相似问题