首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归函数vs setInterval与setTimeout javascript

递归函数vs setInterval与setTimeout javascript
EN

Stack Overflow用户
提问于 2014-04-20 03:11:25
回答 8查看 24.7K关注 0票数 15

我正在使用NodeJs,需要调用一个无限函数,但我不知道什么才是最佳性能。

递归函数

代码语言:javascript
复制
function test(){
//my code
test();
}

setInterval

代码语言:javascript
复制
setInterval(function(){
//my code
},60);

setTimeout

代码语言:javascript
复制
function test(){
//my code
setTimeout(test,60);
}

我希望在不崩溃服务器的情况下获得最好的性能。我的代码有几个算术运算。

感谢任何优化javascript性能的建议。

EN

回答 8

Stack Overflow用户

发布于 2014-10-14 20:53:41

小心..。第一段代码将阻止JavaScript事件循环。

基本上,在JS中,类似于应该处理的函数列表。当您调用setTimeoutsetIntervalprocess.nextTick时,您将将给定的函数添加到这个列表中,当合适的时候,它将被处理。

在第一种情况下,您的代码将永远不会停止,因此它不会让事件列表中的其他函数被处理。

第二和第三种情况是好的。只有一个小小的不同。

如果您的函数需要处理,例如10 be和间隔将是您的60 be。

  • 函数与setInterval将在下列时间处理: 0-10,60-70,120-130,.(因此,它在呼叫之间只有50 so的延迟)
  • 但是对于setTimeout,它将是:
    • 如果您首先调用func : 0-10,70-80,140-150,210-220,.
    • 如果你先打电话给setTimeout : 60-70,130-140,200-210,.

因此,区别在于你函数的启动之间的延迟,在一些基于时间间隔的系统中,比如游戏、拍卖、股票市场,这是很重要的。等等。

祝你的递归好运:-)

票数 35
EN

Stack Overflow用户

发布于 2014-06-20 06:10:44

如前所述,无休止的递归函数会导致堆栈溢出。时间触发的回调将在一个具有清晰堆栈的上下文中执行。

setInterval对于递归setTimeout上更精确的周期性调用非常有用,但是有一个缺点:即使抛出了一个未提及的异常,也会触发回调。这通常每60毫秒产生几个字节长的日志条目,每天1‘440’个条目。此外,重负载的setInterval回调最终可能会出现响应迟钝的脚本,甚至是空洞系统。

如果没有捕获任何异常,则在从函数返回之前立即执行递归setTimeout。它将保证从回调函数返回后的其他任务的时间框架,而不依赖于该函数的执行时间。

票数 12
EN

Stack Overflow用户

发布于 2014-06-13 15:17:40

不确定你想要完成什么,但这里有一种使用递归的“安全”方法.https://stackoverflow.com/questions/24208676/how-to-use-recursion-in-javascript/24208677

代码语言:javascript
复制
/*
this will obviously crash... and all recursion is at risk of running out of call stack and breaking your page...

function recursion(c){
    c = c || 0;
    console.log(c++);
    recursion(c);
}
recursion();

*/

// add a setTimeout to reset the call stack and it will run "forever" without breaking your page!
// use chrome's heap snapshot tool to prove it to yourself.  :)

function recursion(c){
    setTimeout(function(c){
        c = c || 0;
        console.log(c++);
        recursion(c);
    },0,c);
}

recursion();

// another approach is to use event handlers, but that ultimately uses more code and more resources
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23178015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档