首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript Math.ceil(Math.abs())优化

Javascript Math.ceil(Math.abs())优化
EN

Stack Overflow用户
提问于 2011-01-06 20:12:43
回答 6查看 5.1K关注 0票数 6

我在循环中使用Math.ceil( Math.abs( x ) )

有人能为这个操作实现任何优化吗?(按位还是别的什么?)

欢迎您在jsperf.com上进行基准测试

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-01-06 20:41:56

根据webkit JavaScriptCore,Math.abs并没有变得更简单

代码语言:javascript
复制
case MathObjectImp::Abs:
result = ( arg < 0 || arg == -0) ? (-arg) : arg;

但是,ceil使用C的ceil函数

代码语言:javascript
复制
 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更快

所以我想你最好的选择是:

代码语言:javascript
复制
var n = Math.abs(x);
var f = (n << 0),
f = f == n ? f : f + 1;
票数 8
EN

Stack Overflow用户

发布于 2011-01-06 20:42:55

在保持相对可读性的同时,x < 0 ? Math.ceil(-x) : Math.ceil(x)在Firefox3.6中产生了40%的加速(其他的差别很小)。

这是jsPerf page。忽略“一些按位运算符”标签;上面的表达式没有使用任何运算符。

票数 3
EN

Stack Overflow用户

发布于 2011-01-06 20:33:28

Javascript不像C那样是一种编译语言,所以在这种语言中可以创造奇迹的按位操作在JS中就不是那么好了,因为数字是以64位浮点形式存储的。看看这个SO post

即使到那时,您用JS编写的代码也会被底层浏览器以某种方式转换为本机代码,并且可能更快,也可能更慢,具体取决于实现。

由于Math.ceilMath.abs都是内置的,我猜它们都经过了深度优化,所以我怀疑您是否能够通过自己的一些技巧来获得更好的性能。

底线:有三件事会阻碍你更快地完成任务:

JS中的

  1. 数字表示
  2. 事实是,您使用的是一个解释过的

,所以它们在自己的上应该足够快。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4614768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档