在某些用例中,为了检索堆栈跟踪的目的,需要新建一个 Error 对象,例如用于日志记录引擎或内联调试。
在首次创建 Error 对象时,现代 node.js 是否会严重影响性能,或者聪明的 V8 开发人员想出在开发人员调用
根据我对这些工具的探索,我认为直到访问
任何人都可以阐明这一点或建议在调试 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/