javascript - 可视化 Node.js 的堆栈

标签 javascript node.js

我在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/

相关文章:

javascript - 以编程方式激活自定义 TinyMCE 按钮

JavaScript 可以在 Firefox 中运行,但不能在 IE 或 Chrome 中运行?

javascript - 我怎样才能通过 selenium 自动化测试我的 json web 服务?

html - 如何使用 ng-repeat angularjs 打印 html 中的数据

node.js - Node - connect-flash 不适用于重定向

Javascript 使用正则表达式在公司名称周围添加双引号

javascript - 跨域获取iframe当前src url

r - 可以创建每天将 SQL 数据库写入 MongoDB 的管道吗?

javascript - 使用 Phantom.js 评估,如何获取页面的 HTML?

javascript - Promise.all() 将所有结果返回为未定义