2011-12-07 120 views
0

在一塊軟件IM的看着有這樣的事情:記錄「開銷」最佳實踐?

string message = "loggging" + getsomedata + "text" + getsomemoredata + ...; 
DBLog(LOGLEVEL_HIGH, message); 

DBLOG需要一些更多的數據,把它放在一起,並將其傳遞到「loggingservice」

這是一個非常高級別的日誌級別,只能在一些非常罕見的調試場景中設置。在示例系統中,包含此代碼的函數平均每秒調用約25次。

我認爲它可能會花費一點成績,因爲即使日誌記錄關閉,也會每次調用它。這裏要走的路是什麼?嘗試以某種方式到達當前的loglevel,並且只在需要時才調用所有這些?只要讓它保持這樣?完全不同的東西?

回答

1

理想情況下,您的日誌記錄代碼應該確定是否以及何時登錄。不幸的是,這需要你的代碼記錄一些東西,以便始終構造並調用日誌代碼。可以選擇從日誌記錄層公開一個方法來確定是否記錄日誌消息以確定是否應該構造消息。

即:

if(DBWouldLog(LOGLEVEL_HIGH)) 
    { 
     string message = "loggging" + getsomedata + "text" + getsomemoredata + ...; 
     DBLog(LOGLEVEL_HIGH, message); 
    } 
+0

它確定了它自己。你發佈的代碼就是我所說的「試圖以某種方式到達當前的loglevel並且只在需要時才調用所有這些」。但我的問題基本上是如果這是有道理的,或者如果有更好的方法 – Flo

+0

我以爲你擔心日誌消息創建成本......而不是記錄的成本。 –

0

答案取決於語言支持。在我看來,最值得注意的是宏或者內聯函數的支持。

如果您使用的語言與內置的宏像C++(或C,你的代碼看起來並不像),那麼你可以定義宏,就像這樣(假設C/C++宏)這樣的:

#define DBLog(level, message)     \ 
     do {         \ 
      if (DBWouldLog(level)) {   \ 
       DBLog_output(level, message); \ 
     } while (0) 

DBWouldLog(level)可能是簡單的宏(或類似的內聯函數)

#define DBWouldLog(level) (level < DB) 

這將消除函數調用,你似乎擔心成本性能。

請注意,即使您選擇的語言不支持宏,您仍然可以輕鬆地支持宏,方法是首先使用所選宏系統預處理源文件(我已經看到C預處理器用於處理Java代碼並已親自使用eruby在另一個上下文中提供更強大的預處理層)。至少在使用make文件的情況下,實現所需的附加規則非常簡單。