優化判斷日誌是否需要輸出的效能

2021-04-02 22:03:02 字數 2205 閱讀 1704

一般的軟體系統可以根據日誌的不同級別控制日誌的輸出。當使用者設定只輸出錯誤的日誌資訊時,則有大量的告警、通知和除錯的日誌資訊不會輸出。由於有大量資訊未輸出,是否存在優化程式效能的可能呢?我們先來看看通常的日誌是如何處理的。

在程式實現時,通常給每條日誌賦於一定的級別,一般分為emerg、 alert、crit、err、warning、notice、info和debug等依次增高8個級別。然後我們在日誌輸出函式內部判斷該日誌級別是否不高於當前可輸出日誌級別,若不高於,則輸出該日誌,否則忽略該日誌資訊。如程式1 my_log.h和程式2 my_log.c所示,為簡單起見,在此以日誌在螢幕上輸出為例說明。

#ifndef my_log_h

#define my_log_h

// loglevel

enum ;

// 設定可日誌輸出級別

void my_set_log_levels(int level);

// 日誌處理函式

void my_log(int level, const char *fmt, ...);

#endif //my_log_h

程式1: my_log.h

#include

#include

#include "my_log.h"

int __my_allow_log_level = my_log_emerg;

void my_set_log_levels(int level)

void my_log(int level, const char *fmt, ...)

}程式2: my_log.c

顯而易見,在上述的程式2中,呼叫日誌處理函式my_log輸出日誌時,不管日誌根據使用者設定是否需要輸出,都要進行一次函式呼叫。在該函式執行過程中,才根據當前可輸出日誌級別判斷該日誌是否需要輸出。若不需要輸出,就立即退出該函式。也就是說,無論日誌是否需要輸出,程式都將進行一次函式呼叫。

在寫文[1]的過程中,本人受到啟發。日誌輸出和除錯資訊輸出屬於同類問題,都是可選擇輸出某級別以下的資訊,而高於該級別的資訊不輸出。那麼我們可以和除錯資訊輸出一樣,為了改進程式效率,可以將判斷日誌是否需要輸出移至函式my_log外執行(如程式3和程式4 所示)。這樣,先通過if語句判斷是否需要輸出日誌,若需要輸出,才呼叫函式__my_log輸出日誌,從而提高整個程式的執行效能。

#ifndef my_log_h

#define my_log_h

// loglevel

enum ;

// 非log.c檔案的外部變數宣告

#ifndef my_log_c

extern int __my_allow_log_level;

#endif

// (內部使用) 判斷"section"**段是否允許"debug_level"級的除錯資訊輸出

#define __my_allow_log(log_level) /

( log_level <= __my_allow_log_level )

// (內部使用)實際的日誌輸出函式

void __my_log(int level, const char *fmt, ...);

// 設定可日誌輸出級別

void my_set_log_levels(int level);

// 日誌處理函式

#define my_log(level, fmt, arg...) /

if( __my_allow_log(level) ) __my_log(level, fmt, ##arg)

#endif //my_log_h

程式3: 改進後的my_log.h

#include

#include

#include "my_log.h"

int __my_allow_log_level = my_log_emerg;

void my_set_log_levels(int level)

void __my_log(int level, const char *fmt, ...)

程式4: 改進後的my_log.c

同樣,也可以和文[1]中描述的為每個程式模組設定不同的除錯資訊顯示等級一樣,為每個程式模組設定不同的日誌輸出級別,本文就不再累贅了。

[1] c語言中幾種輸出除錯資訊的方法, http://blog.csdn.net/thinkerabc/archive/2006/03/04/615378.aspx , 2006.03.04

條件判斷的效能優化

if else if else 直接略過,不建議。switch this.currentwrite 雖然用switch效能比較好,但是明顯很煩,我們可以用陣列的形式來優化 const obj 專案經理初審 執行部門審核1 總經理審批 2,遠端服務 預判 執行部門審核2 現場執行2 執行部門審核3 申...

判斷棧的輸出序列是否合法

乙個最多可以儲存m個數的棧 按1,2,3.順序入棧並隨機出棧 輸入乙個出棧序列,判斷給出 出棧序列是否合理乙個棧 按序入棧 乙個數 判斷棧的大小是否超出要求 乙個flag 標誌該序列是否合理 include include using namespace std const int maxn 101...

Mysql效能優化需要考慮的因素

對於程式設計師來說資料庫就是操作非常方便的資料儲存中心,希望什麼資料都存放在資料庫中,不論是需要持久化的資料,還是臨時存放的過程資料,不論是普通的純文字格式的字元資料,還是多 的二進位制資料,都喜歡全部塞如資料庫中。因為對於應用伺服器來說,資料庫很多時候都是一集中式的儲存環境,不像應用伺服器那樣可能...