Javascript 性能:递归-非递归(IE)
我有两个函数来计算n!(阶乘)。第一个是递归函数,第二个是直循环。我已经测试了他们的表现。对于我测试过的所有浏览器,非递归函数的性能都优于递归函数,IE除外(针对v7、8和9进行了测试)。现在我已经习惯了IE和jscript作为例外,但在这种情况下我很草率:造成这种差异的原因是什么(换句话说,如果我想让我的阶乘在每个浏览器中都很快,我必须首先检查浏览器;) 使用的功能包括:Javascript 性能:递归-非递归(IE),javascript,performance,internet-explorer,recursion,Javascript,Performance,Internet Explorer,Recursion,我有两个函数来计算n!(阶乘)。第一个是递归函数,第二个是直循环。我已经测试了他们的表现。对于我测试过的所有浏览器,非递归函数的性能都优于递归函数,IE除外(针对v7、8和9进行了测试)。现在我已经习惯了IE和jscript作为例外,但在这种情况下我很草率:造成这种差异的原因是什么(换句话说,如果我想让我的阶乘在每个浏览器中都很快,我必须首先检查浏览器;) 使用的功能包括: //recursive function factorial(n) { var result = 1,
//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;
}
可能是因为浏览器无法优化。它没有意识到可以迭代地重写lambda函数,从而消除函数调用的开销
浏览器并不是完全成熟的编译器,我也不希望它们能够执行传统编译器执行的所有优化。如果某个浏览器可以执行特定的优化,那就太好了。但这并不意味着所有人都会这么做。我已经看得更远了,但在这个问题上找不到任何东西。在测试之后,删除IE版本1中的三元组似乎使IE的行为与其他浏览器类似(请参阅)。但是测试的结果并没有显示出真正的差异 好吧,我们就这样吧。我在这里学到的是,最好看看递归函数是否可以用迭代的方式重写。后者似乎优于递归
感谢您的回答,非常感谢。尝试用r=r*(…)替换r*=因为IE使用复合运算符速度较慢。还可以尝试使用if循环,而不是三元运算符-当代码更简单时,更多的代码通常更快。哦,在IE 6中,非递归版本比递归版本快7倍。因为在第一个条件测试中已经减少了
n
,r!=n
始终为真。是的,但没有区别。@Gumbo,你说得对,这是一个使用n的早期版本的残余--@Gumbo:而且。。。如果没有过时的三元组,即使IE对于非递归函数也会更快。看,我也试过了。如果我做得对的话,尾部递归做得不多。不,我的意思是,lambda函数也在使用尾部递归。这可能就是它速度慢的原因。问题不在于递归本身,而在于所有(经过测试的)浏览器的原因,而在于IE对阶乘使用迭代函数更快。