2016-02-10 15 views
4

有些用例需要爲了檢索堆棧跟蹤而新增一個Error對象,例如用於記錄引擎或內聯調試。新增的性能點擊現代Node.js中的錯誤對象

當Error對象第一次創建時,或者當智能V8開發人員想通過開發人員調用<錯誤> .stack屬性時根據需求展開堆棧,是否會在現代node.js中產生嚴重的性能下降。

從我對這些工具的探討中,我認爲堆棧跟蹤展開不會執行,直到<錯誤> .stack被訪問並且它似乎是常識設計方法。

任何人都可以闡明這一點或建議的方法來驗證短的調試本機V8代碼?

+0

你爲什麼不創建基準測試和度量? – jfriend00

+0

@ jfriend00 - 剛完成這個。結果將在下面回答我的問題。 –

回答

6

我建立了基準測試並將其發佈到my github repo。我的測試結果證實,node.js後面的V8引擎在創建任何Error對象(包括Error的子類)時捕獲堆棧信息。

我的測試相當精細,但我想確保繞過V8中用於展開調用堆棧的任何優化。我通過在每次測試迭代中生成一個隨機調用堆棧來實現這一點。我還嘗試調用Error.stack並且不調用Error.stack,並且這種影響可以忽略不計。

有趣的是,性能打擊構造的錯誤,解開堆棧的長度超過10步,並將堆棧跟蹤作爲一個字符串拉成本只有大約87微秒。構建通用對象的成本約爲21微秒。

我還發現了V8 Github上庫Stack Trace API頁面上的提示:

注意,自定義prepareStackTrace功能立即叫做該點創建錯誤對象時(例如,用新的錯誤())。

+0

看來你已經得到了你的答案! – jfriend00

相關問題