Node.js:异步函数中是否对尾部调用进行了优化?

莫尔斯电编码器

我正在使用Node v8.10.0

上面的问题解释了Node.js如何不再支持TCO。我最近遇到了如下功能的问题:

async function processBatch(nthBatch) {
    // do a bunch of async work and build up variables
    await processBatch(nthBatch + 1);
}

该代码有内存泄漏,可通过将其更改为以下内容立即解决:

async function processBatch(nthBatch) {
    // do a bunch of async work and build up variables
    return processBatch(nthBatch + 1);
}

令我惊讶的是,它确实有效,因为在上述问题中,它清楚地说明了Node 8.x不支持TCO。那么,有什么特别的事情可以在这里启用TCO?还是因为它在引擎盖下使用生成器并且返回标记生成器已完成,所以可以丢弃堆栈?

莫尔斯电编码器
async function processBatch(nthBatch) {
    // do a bunch of async work and build up variables
    await processBatch(nthBatch + 1);
}

该代码段导致内存泄漏,因为注释处声明的变量无法进行垃圾回收,因为解释器不知道将不再需要它们。例如,解释器当时不知道在后面没有一行await可能需要所有声明的变量。

async function processBatch(nthBatch) {
    // do a bunch of async work and build up variables
    return processBatch(nthBatch + 1);
}

在此示例中,该函数被返回,因此垃圾收集器可以安全地清除方法中声明的变量。请注意,堆栈会停留在周围,并且如果此递归函数的迭代次数过多,则会Maximum call stack size exceeded引发错误,但是声明为实况的变量在堆中,因此可以在保持堆栈信息完整的同时进行垃圾回收。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

是否对JavaScript引擎尾部调用(TCO)进行了优化?

ML系列编译器是否对尾部调用进行了任何复杂的优化?

在异步函数Node.Js中调用的异步函数

我是否正确进行了连接池?使用node-postgres库

即使对节点js进行了更改,Node js也会在控制台中显示旧文件

在 JavaScript/node js 中的 for 循环中调用异步函数

正确的过程以在node.js中调用多个异步函数

node.js tls 模块进行了哪些相互身份验证检查?

在 Node JS 应用程序中使用 Kafka Consumer 来指示已经进行了计算

如果将文件可写流传递到Node.js中的Console构造函数,是否对其进行异步写入?

是否对克隆语句进行了优化?

在Node.js中循环异步函数

如何在Node.js或Javascript中将异步函数调用包装到同步函数中?

Node.js-如何通过回调调用异步函数?

在Node.js中使用异步瀑布进行函数迭代

服务器响应中异步函数调用导致的node.js结果

emscripten:在 Node.js 中异步调用时,C 函数未“就绪”

JS(node.js)-如果我进行异步调用但不等待其完成,是否可以保证完成执行?

node.js 中的基本函数调用

Node.js中的函数调用执行

是否可以从 node.js 中的异步函数返回值?

是否无法确定函数是否是生成器函数(如果已对.bind()进行了调用)?

JavaScript尾部调用中的函数是否已优化?

Ubuntu是否针对多核CPU进行了优化?

数组是否在 jOOQ 和 PostgreSQL 中进行了优化?

OpenCV是否在调试模式下进行了优化?

如何确定Swift是否使用优化进行了编译

是否对if(0)和if(1)语句进行了优化?

试图了解将Kubernetes Worker Node和Pod与Docker“ Service”进行了比较