node.js - 在现代 Node.js 中更新 Error 对象的性能损失

标签 node.js performance stack-trace v8

在某些用例中,为了检索堆栈跟踪的目的,需要新建一个 Error 对象,例如用于日志记录引擎或内联调试。

在首次创建 Error 对象时,现代 node.js 是否会严重影响性能,或者聪明的 V8 开发人员想出在开发人员调用 .stack 属性时按需展开堆栈。

根据我对这些工具的探索,我认为直到访问 .stack 才会执行堆栈跟踪展开,这似乎是一种常识性设计方法。

任何人都可以阐明这一点或建议在调试 native V8 代码的情况下进行验证的方法吗?

最佳答案

我构建了一个基准测试并将其发布到 my github repo .我的测试结果证实,node.js 背后的 V8 引擎在创建任何错误对象(包括错误的子类)时捕获堆栈信息。

我的测试相当复杂,但我想确保绕过 V8 中的任何优化以展开调用堆栈。我通过在每次测试迭代中生成一个随机调用堆栈来实现这一点。我还尝试调用 Error.stack 而不是调用 Error.stack,其影响可以忽略不计。

有趣的是,构建错误的性能受到影响,展开长度超过 10 步的堆栈并将堆栈跟踪作为字符串拉出仅花费了大约 87 微秒。构建通用对象的成本约为 21 微秒。

我还在 V8 Github 存储库上找到了一条注释 Stack Trace API页:

Note that the custom prepareStackTrace function is immediately called at the point when the error object is created (e.g. with new Error()).

关于node.js - 在现代 Node.js 中更新 Error 对象的性能损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35306496/

相关文章:

javascript - 尝试将 Next.js 应用程序部署到 Zeit 云并在开发模式下运行时出错

node.js - 如何使用 MongoDB(Mongoose) 在集合中添加/更新 ObjectId 数组?

java - 为什么我的 libgdx 游戏速度逐渐变慢?

python - 如何在 TestCase 子类中隐藏堆栈帧?

java - Android:通用空指针异常

node.js - 如何更新 node-gyp 和/或解释 "node-gyp rebuild 2> builderror.log)"?

node.js - WebPack 开发服务器错误 : require is not defined

java - 如何加快 Java 文本文件解析器的速度?

r - 在 R 中更新数据集的最快方法是什么?

android - 如何找到这个堆栈跟踪?