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

时间:2011-04-04 06:35:29

标签: javascript performance internet-explorer recursion

我有2个函数来计算n! (阶乘)。第一个是递归函数,第二个是直接循环。我在jsperf.com测试了他们的表现。对于我测试的所有浏览器,非递归函数优于递归函数,除了IE (针对v7,8 en 9进行了测试)。现在我已经非常习惯IE和jscript是例外,但在这种情况下我是愚蠢的:可能是造成差异的原因(换句话说,如果我希望我的阶乘在每个浏览器中都快,我必须真的先检查浏览器;)?

使用的功能是:

//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; 
}

2 个答案:

答案 0 :(得分:1)

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

浏览器并不是真正意义上的完全成熟的编译器,我不希望它们能够执行传统编译器执行的所有优化。如果某个浏览器可以执行特定的优化,那就太棒了。但这并不意味着一切都会。

答案 1 :(得分:0)

我看得更远,但在这个问题上找不到任何东西。经过测试,似乎删除jsperf test版本1中的三元组使IE的行为与其他浏览器一样(请参阅rev 5 of the jsperf-test)。但是对ternary on it's own的测试并没有真正显示出差异。

好吧,让我们离开它。我在这里学到的是,建议是否可以以迭代方式重写递归函数。后者似乎胜过递归。

感谢您的回答,感谢您。