有些用例需要爲了檢索堆棧跟蹤而新增一個Error對象,例如用於記錄引擎或內聯調試。新增的性能點擊現代Node.js中的錯誤對象
當Error對象第一次創建時,或者當智能V8開發人員想通過開發人員調用<錯誤> .stack屬性時根據需求展開堆棧,是否會在現代node.js中產生嚴重的性能下降。
從我對這些工具的探討中,我認爲堆棧跟蹤展開不會執行,直到<錯誤> .stack被訪問並且它似乎是常識設計方法。
任何人都可以闡明這一點或建議的方法來驗證短的調試本機V8代碼?
有些用例需要爲了檢索堆棧跟蹤而新增一個Error對象,例如用於記錄引擎或內聯調試。新增的性能點擊現代Node.js中的錯誤對象
當Error對象第一次創建時,或者當智能V8開發人員想通過開發人員調用<錯誤> .stack屬性時根據需求展開堆棧,是否會在現代node.js中產生嚴重的性能下降。
從我對這些工具的探討中,我認爲堆棧跟蹤展開不會執行,直到<錯誤> .stack被訪問並且它似乎是常識設計方法。
任何人都可以闡明這一點或建議的方法來驗證短的調試本機V8代碼?
我建立了基準測試並將其發佈到my github repo。我的測試結果證實,node.js後面的V8引擎在創建任何Error對象(包括Error的子類)時捕獲堆棧信息。
我的測試相當精細,但我想確保繞過V8中用於展開調用堆棧的任何優化。我通過在每次測試迭代中生成一個隨機調用堆棧來實現這一點。我還嘗試調用Error.stack並且不調用Error.stack,並且這種影響可以忽略不計。
有趣的是,性能打擊構造的錯誤,解開堆棧的長度超過10步,並將堆棧跟蹤作爲一個字符串拉成本只有大約87微秒。構建通用對象的成本約爲21微秒。
我還發現了V8 Github上庫Stack Trace API頁面上的提示:
注意,自定義prepareStackTrace功能立即叫做該點創建錯誤對象時(例如,用新的錯誤())。
看來你已經得到了你的答案! – jfriend00
你爲什麼不創建基準測試和度量? – jfriend00
@ jfriend00 - 剛完成這個。結果將在下面回答我的問題。 –