有一些用例需要为了检索堆栈跟踪而新建一个Error对象,例如用于记录引擎或内联调试。
首次创建Error对象时,现代node.js是否会出现严重的性能损失,或者当开发人员调用< Error> .stack属性时,智能V8开发人员想要按需展开堆栈。
从我对这些工具的探讨中,我认为在访问< Error> .stack之前不会执行堆栈跟踪展开,这似乎是一种常识设计方法。
有人可以了解这一点或建议验证调试本机V8代码的方法吗?
答案 0 :(得分:8)
我构建了基准测试并将其发布到my github repo。我的测试结果证实,node.js后面的V8引擎在创建任何Error对象时捕获堆栈信息,包括Error的子类。
我的测试相当复杂,但我想确保绕过V8中的任何优化来解除调用堆栈。我通过在每次测试迭代上生成一个随机调用堆栈来实现这一点。我还尝试调用Error.stack而不是调用Error.stack,这种影响可以忽略不计。
值得注意的是,构造错误的性能受到了影响,解除了长度超过10步的堆栈并将堆栈跟踪拉成一个字符串只花费了大约87微秒。构建通用对象的成本约为21微秒。
我还在V8 Github存储库Stack Trace API页面上找到了一条说明:
请注意,自定义prepareStackTrace函数会在创建错误对象时立即调用(例如,使用新的Error())。