2014-01-23 74 views

回答

4

行號被編譯成.class文件,並讓他們比沒有這樣做,肯定更多的工作。

您可以通過Thread#getStackTrace()獲得堆棧跟蹤而不會引發異常,但創建異常的成本大致相同(您不需要拋出並捕獲它)。

How Expensive is Thread.getStackTrace()?

提及,但過度砍伐獨自已經可以直接在系統大大放緩,收集的信息可以是相當昂貴。

這是高性能系統中包含文件行號的性能問題嗎?

您應該測試它。如果它不是沒有行號的性能問題,那很可能是沒有問題的。這一切都取決於你登錄的地點和頻率。


documentation還提到行號

生成行號信息不是特別快。因此,應該避免使用它,除非執行速度不是問題。

1

我的Java記錄器(比如說logback)如何找到我的代碼的行號?

您可以自己閱讀代碼。它是availableonline in various places

這是高性能系統中包含文件行號的性能問題嗎?

是的,如果你做了很多logger.log調用(或等價的)。 Log4j和Logback的文檔都會這樣說。

是否需要拋出一個異常並分析堆棧跟蹤來做到這一點,或者是否有另一個技巧呢?

我的理解是,這是應用程序代碼執行此操作的唯一實用方法。

(你可以假設重新使用現有的例外對象,然後調用fillInStackTrace()每次你想捕捉的堆棧幀的時間。但是,性能優勢將是微乎其微的,尤其是當你已經處理了多線程問題。)