Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.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性能会受到深层递归的影响吗?_Javascript_Performance_Recursion - Fatal编程技术网

javascript性能会受到深层递归的影响吗?

javascript性能会受到深层递归的影响吗?,javascript,performance,recursion,Javascript,Performance,Recursion,我已经编写了一个javascript,通过javascript的帮助在HTML中模拟WPF DockPanel布局行为 现在,一旦我开始将这些面板嵌套到递归级别10,我就会遇到性能问题。奇怪的是,它只不过是普通的递归,在最深层次上,所讨论的函数在0,2到2ms之间完成 现在要么我确实有一些鬼性能损失,要么调用javascript递归会有巨大的成本?我希望你们当中有人知道 如果有成本的话,显而易见的解决方案是递归展开,这将是相当悲哀的 我已经读过了,但这是否真的意味着我可能必须接受递归深度n=f

我已经编写了一个javascript,通过javascript的帮助在HTML中模拟WPF DockPanel布局行为

现在,一旦我开始将这些面板嵌套到递归级别10,我就会遇到性能问题。奇怪的是,它只不过是普通的递归,在最深层次上,所讨论的函数在0,2到2ms之间完成

现在要么我确实有一些鬼性能损失,要么调用javascript递归会有巨大的成本?我希望你们当中有人知道

如果有成本的话,显而易见的解决方案是递归展开,这将是相当悲哀的

我已经读过了,但这是否真的意味着我可能必须接受递归深度n=functioncost*(10^(n-1))作为我将要使用的每个递归深度

这也驳斥了递归比迭代慢的观点

这说明迭代比递归快4倍(叹气…)

这是一个一般性问题,与浏览器JS引擎无关。如果你知道它在一个方面进展缓慢,但在另一个方面进展迅速,那么这些信息也会受到欢迎。我以为这一切都是一样的

Wrapup访客信息:递归与迭代的影响非常显著。一般情况下迭代获胜。

  • 系数FF30:5~
  • 系数36:40~
  • 因子本机IE8,WinXP:10~

是的,递归对JavaScript的性能有很大的影响,请始终避免递归,只使用迭代方法

斐波那契函数的一个简单示例(递归vs循环):

我不久前写的另一个示例(对象导航):


操作测试:

您在这里使用的是哪个JavaScript引擎?Safari、Chrome、Firefox和Internet Explorer都有完全不同的实现。@tadman添加了一些信息。我想我会用自定义测试脚本来调查一些,直到有人对此做出贡献,由于在链接的postsEach JavaScript引擎中存在相互冲突的测试结果,因此JavaScript引擎是使用不同的性能优化技术构建的,并且它们在某些类型的操作中表现得非常不同。有一些非常普遍的规则,但递归本身并不是通常的基准。天哪。。。FF30和chrome 36在我的机器上的系数几乎为60。你在第四版到第五版之间有什么变化?现在它从一个因子60变成了2?有没有办法将这个基准移动到setTimeout中?显然,由于我必须关闭“慢脚本”对话框,我无法在本机IE 8中进行适当的测量。使用斐波那契有点不公平,因为递归是指数的。这与JS中递归的正常用法不匹配。@micnic在我的特殊情况下,我没有备忘录信息,因此#4更具决定性,我用#8修改了它以支持IE8。谢谢你的帮助。@AndreasMüller,用“非指数”递归检查我的更新答案,结果是一样的:递归非常昂贵
var a = {
    b: {
        c: 'd'
    }
};

find(a, 'b/c'); // => 'd'