Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 性能:递归-非递归(IE)_Javascript_Performance_Internet Explorer_Recursion - Fatal编程技术网

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

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,

我有两个函数来计算n!(阶乘)。第一个是递归函数,第二个是直循环。我已经测试了他们的表现。对于我测试过的所有浏览器,非递归函数的性能都优于递归函数,IE除外(针对v7、8和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; 
}

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


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

我已经看得更远了,但在这个问题上找不到任何东西。在测试之后,删除IE版本1中的三元组似乎使IE的行为与其他浏览器类似(请参阅)。但是测试的结果并没有显示出真正的差异

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


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

尝试用r=r*(…)替换r*=因为IE使用复合运算符速度较慢。还可以尝试使用if循环,而不是三元运算符-当代码更简单时,更多的代码通常更快。哦,在IE 6中,非递归版本比递归版本快7倍。因为在第一个条件测试中已经减少了
n
r!=n
始终为真。是的,但没有区别。@Gumbo,你说得对,这是一个使用n的早期版本的残余--@Gumbo:而且。。。如果没有过时的三元组,即使IE对于非递归函数也会更快。看,我也试过了。如果我做得对的话,尾部递归做得不多。不,我的意思是,lambda函数也在使用尾部递归。这可能就是它速度慢的原因。问题不在于递归本身,而在于所有(经过测试的)浏览器的原因,而在于IE对阶乘使用迭代函数更快。