首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >性能:递归-非递归(IE)

性能:递归-非递归(IE)
EN

Stack Overflow用户
提问于 2011-04-04 06:35:28
回答 2查看 904关注 0票数 3

我有两个函数来计算n!(阶乘)。第一个是递归函数,第二个是直线循环。我在jsperf.com中测试了他们的性能。对于所有浏览器,我测试的非递归函数都优于递归函数,除了IE (测试了v7,8 en 9)。现在,我非常习惯IE和jscript是一个例外,但在这种情况下,我很粗鲁:造成这种差异的原因是什么(换句话说,如果我想让我的阶乘在每个浏览器中都快速运行,那么我必须首先检查浏览器吗?)

所使用的职能如下:

代码语言:javascript
运行
复制
//recursive
function factorial(n) {  
 var result = 1,      
 fac = function(n) {    
         return result *= n, n--, (n > 1 ? fac(n) : result);      
       };  
 return fac(n); 
}
//nonrecursive
function factorialnr(n){
  var r = n;  
  while (--n > 1) {   
    r *= r != n ? n : 1;  
  }  
  return r; 
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-05 05:37:54

我已经仔细看过了,但在这个问题上什么也找不到。经过测试,似乎删除了杰斯普夫试验第1版中的三元代码使IE与其他浏览器一样运行(参见jsperf测试的参考文献5)。但是对三元制的测试并没有显示出真正的不同。

好吧,我们就这样吧。我在这里学到的是,查看递归函数是否可以以迭代的方式重写是明智的。后者似乎优于递归。

谢谢你的回答,非常感谢。

票数 0
EN

Stack Overflow用户

发布于 2011-04-04 06:42:29

可能是因为浏览器无法优化尾递归。它没有意识到您的lambda函数可以迭代重写并消除函数调用的开销。

浏览器并不是真正成熟的编译器,我也不指望它们能够执行传统编译器所执行的所有优化。如果某个浏览器能够执行特定的优化,那就太棒了。但这并不意味着所有人都会。

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

https://stackoverflow.com/questions/5535296

复制
相关文章

相似问题

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