如何在你的日誌系統中挖個坑?

瓦倫西亞最近給哈維的C++項目做了不少貢獻。特別是把方法調用中複雜數據結構傳值改爲了引用傳遞後,解決了不少的性能問題——尤其在某些特定的編譯器上。

“這很簡單”,瓦倫西亞以爲,“任何人都能做這樣的事情。”然而,隨着他們對代碼的深入……

最早的代碼使用空格縮進,而哈維習慣使用Tab鍵。這按說只是一個小問題,然而哈維使用了大量的Tab縮進——他的代碼風格是儘可能多地嵌套代碼塊。代碼中還隨處可見魔法數值(這本應該使用枚舉替代),並且哈維頑固地堅持能用double存儲的數字堅決不要用int類型,這導致了代碼的質量極其糟糕。

例如,你會如何將一個char型轉換爲string?是不是僅僅是將char變量直接傳遞給std::string()構造函數?但如果是哈維,就不會這麼做,事實上他是這麼做的:

std::string ToString(char c) {
    std::stringstream ss;
    std::string out = "";
    ss << c;
    ss >> out;
    return out;
}

然後,如果你要在內存中緩存數據怎麼做?使用map會是一個好的緩存容器。在更新緩存的時候要訪問幾次鍵名?四次怎麼樣?哈維就是這麼幹的!

void WriteCache(std::string key, std::string value) {
    Setting setting = mvCache["cache_"+key];
    if (!setting.initialized)
    {
        setting.initialized=true;
        setting.data = "";
        mvCache.insert(std::map<std::string,Cache>::value_type("cache_"+key,setting));
        mvCache["cache_"+key]=setting;
    }
    setting.data = value;
    mvCache["cache_"+key]=setting;
}

而且很難知道他們是如何理解mv這個前綴的——衆多濫用的縮寫符簡直是程序員的恐怖“發明”!“不幸的是,哈維在做這個項目的時候對縮寫也使用不當。這本是一件簡單的事情,然而,瀏覽這些醜陋糟糕的代碼讓人無語!

再比如日誌,通常如果要控制日誌記錄的文件大小,你會聽說過日誌級別,這可以很好地通過設置日誌等級控制日誌記錄文件大小。哈維也用了日誌等級,來看看哈維怎麼做的。

bool LogLess(int iMaxLevel){
     int verboseLevel = rand() % 1000;
     if (verboseLevel < iMaxLevel) return true;
     return false;
}
//how it's used:
if(LogLess(500))
   log.debug("I appear half of the time");

這段代碼的LogLess方法可以通過直接返回一個表達式表示來簡化代碼。但這不是重點,重點是他們搞了一個隨機的日誌記錄等級,這就是他們解決日誌文件過大的方法——隨機地將一些日誌給扔掉!這簡直就是給自己 挖了一個大坑!

瓦倫西亞通過優化最終取得了很好的結果:重寫之後的代碼編譯更快,內存佔用也下降了,而且運行速度取得了數量級的提高。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章