我在node.js中有一个递归调用。我正在尝试找出如何优化它,以便它使用租用 CPU 周期并具有最小的堆栈内存。
function baz(callback) {
if (bool){
callback();
return;
}
else{
setImmediate(function(){
return baz(callback);
});
}
}
我唯一可以真正调整的是 return 语句的存在以及它们的放置位置。我认为如果没有返回到正确的位置,堆栈将会增长更多。
是否有一个适用于 Node.js 的分析工具,我可以在运行时查看堆栈?
最佳答案
通过将对 baz
的调用放在 setImmediate
中,您实际上并没有按照您想象的方式递归调用堆栈。要认识到的关键点是,对 baz 的第一次调用将在对 baz
的第二次调用开始之前返回。 (请注意,在 javascript 函数中,return
关键字是可选的,函数在到达函数 block 末尾时默认返回 undefined
)
或者,这样想。某些事件(称为事件 A)会触发对 baz
的第一次调用以及递归例程的开始。您提供给 setImmediate
的回调不会立即启动,它将作为一个新事件排队,将其称为事件“B”,并且该事件直到之后 事件 A 已完成,执行已爬出该事件的调用堆栈。
Node.js 将继续解析在调用 setImmediate
之前可能已优先安排的任何其他事件,直到它最终到达事件“B”并运行您的第二次调用 baz
,等等。
换句话说,baz
是一种事件驱动算法,而不是递归算法。您的堆栈深度不会任意增大。
关于javascript - 可视化 Node.js 的堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30361434/