现代Node.js中新兴Error对象的性能损失

Tim*_*inn 5 performance v8 stack-trace node.js

为了检索堆栈跟踪,有一些用例需要新建一个Error对象,例如用于记录引擎或内联调试.

在第一次创建Error对象时,现代node.js是否会出现严重的性能损失,或者当开发人员调用<Error> .stack属性时,智能V8开发人员想要按需解除堆栈.

从我对工具的探讨,我认为在访问<Error> .stack之前不会执行堆栈跟踪展开,这似乎是一种常识设计方法.

任何人都可以阐明这一点或建议验证调试本机V8代码的方法吗?

Tim*_*inn 8

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

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

值得注意的是,构造错误的性能受到影响,解除了长度超过10步的堆栈并将堆栈跟踪拉成一个字符串,仅花费了大约87微秒.构建通用对象的成本约为21微秒.

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

请注意,自定义prepareStackTrace函数会在创建错误对象时立即调用(例如,使用新的Error()).