我有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;
}
答案 0 :(得分:1)
可能是因为浏览器无法优化tail recursion。它没有意识到你的lambda函数可以迭代重写并消除函数调用的开销。
浏览器并不是真正意义上的完全成熟的编译器,我不希望它们能够执行传统编译器执行的所有优化。如果某个浏览器可以执行特定的优化,那就太棒了。但这并不意味着一切都会。
答案 1 :(得分:0)
我看得更远,但在这个问题上找不到任何东西。经过测试,似乎删除jsperf test版本1中的三元组使IE的行为与其他浏览器一样(请参阅rev 5 of the jsperf-test)。但是对ternary on it's own的测试并没有真正显示出差异。
好吧,让我们离开它。我在这里学到的是,建议是否可以以迭代方式重写递归函数。后者似乎胜过递归。
感谢您的回答,感谢您。