在新的Node.js错误对象的性能命中

在用于检索堆栈跟踪(例如用于logging引擎或内联debugging)的目的中,需要新增一个Error对象的用例。

在第一次创buildError对象时,现代node.js中有没有一个很重的性能问题,或者当开发人员调用<Error> .stack属性时,聪明的V8开发人员就会根据需求展开堆栈。

从我对这些工具的探究中,我认为堆栈跟踪展开不会被执行,直到访问<Error> .stack,这似乎是一个常识性的devise方法。

任何人都可以阐明这一点或build议的方法来validation短的debugging本机V8代码?

我build立了基准testing,并将其发布到我的github回购 。 我的testing结果证实,node.js后面的V8引擎在创build任何Error对象(包括Error的子类)时捕获堆栈信息。

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

值得注意的是,构buildError的性能打开了一个刚好超过10步的堆栈,并且将堆栈跟踪拉成一个string,只耗费了大约87微秒的时间。 构build通用对象的成本约为21微秒。

我还在V8 Github仓库堆栈跟踪API页面上find了一个注释:

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