2010-09-09 71 views

回答

7

在這種情況下,我會使用B.

然而,如果構成該日誌消息(該參數log.Debug)可以需要一段時間 - 涉及重要的字符串連接,例如 - 然後我會去A.它將最終在「是,記錄它」的情況下執行兩次相同的測試,但它不需要構建日誌信息在「不,不記錄」的情況下。

1

即使第一個選項稍微高性能,我也不會太擔心。

但是,如果你做這樣的事情:

_log.Debug(String.Format("{0} {1} {2}...", param1, param2, param3)); 

再有就是對之前檢查_log.IsDebugEnabled強烈的情況下。

4

我會選擇選項B,除非日誌消息本身需要很長時間才能構建。通常情況下的性能增益可忽略不計或甚至不存在。在內部,log4net執行相同的檢查,所以你不會自己改變任何東西。

但正如我所說,選擇A可能在這樣的情況下是一個好主意:

if (_log.IsDebugEnabled()) 
{ 
    var message = createComplicatedLogMessageThatTakesALotOfTime(); 
    _log.Debug(message); 
} 

對於所有其他情況,它只是增加了三個線在每次登錄的消息剛剛是不是值得努力。

2

以前的分析表明,Log4Net的IsXXXEnabled實現不是最快的,因爲它調用其他幾種方法。 NLog的版本會執行一次易失性讀取,所以速度會更快,但實際上,如果您的瓶頸在於IsXXXEnabled,那麼您已經在做低延遲的工作,並且最終可能會耗盡您自己的專用日誌記錄。

+0

您能否更具體地瞭解您的「以前的分析」? – Zonko 2011-11-03 11:28:23

+0

抓取一個反編譯器並逐步啓用Log4Net的IsXXX - 您可以跳過很多虛擬方法調用。 – 2011-11-08 16:45:16

0

選項A是更好的,因爲:

你可能不知道什麼是包調試()方法落後。在傳遞給log4net的Debug()調用之前,是否有人添加了一個本地包裝來處理額外的邏輯? log4net在該方法中做了什麼?您可能正在使用log4net的源代碼來構建您的程序集,並讓另一個團隊成員更改了它?好的,所以你親自審覈了代碼,而且它非常快,你使用的是Nuget的程序集,所以你知道你的團隊中沒有人改變它。明天什麼時候log4net的新版本下降?你怎麼知道有一個工作在log4net bug上的人沒有引入一些日誌代碼在你所有的緊密循環中融化你的服務器?下一位實習生是否會像您一樣複製您的代碼並對其進行修改,並考慮如何進行冗長複雜的日誌調用可能比預期成本更高?另外,請記住,不同的appender可能會有不同的日誌成本。如果某人爲較慢的同步裝置更換輕量級快速異步appender會發生什麼情況?

底線:防守編碼。這是一個非常簡單和便宜的布爾檢查,它可以在規模和負載下防止出現一些意想不到的棘手的性能問題。你有沒有看過這張支票,並說'我真的很後悔寫這個'?不太可能。

+0

對於調試,這可能是這種情況,但對於其他方法,如log()和查看數百行if語句檢查後,它開始膨脹代碼並且毫無意義。 – user441521 2017-11-28 13:11:51

相關問題