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

标签 javascript performance internet-explorer recursion

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

用到的函数有:

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

最佳答案

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

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

关于javascript - 性能:递归-非递归(IE),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5535296/

相关文章:

c - 哪个更快,乘法还是减法?

javascript - 谷歌地图信息窗口显示kml对象名称和链接

javascript - 使用正则表达式从路径中提取文件名

performance - 忽略lua中代码的最有效方法是什么?

html - 使用 AutoIt 从 iframe 获取表单名称

html - IE8 中的 Overflow-X

jQuery 与 IE8 及更低版本的兼容性问题

javascript - 是否可以在 Greasemonkey 脚本中使用 worker?

javascript - 如何获取作为变量获取的 <tr> 内容的填充左值

python - 如何有效地将函数应用于数据框中的每一行