2011-09-15 40 views
2

是否值得保留本地副本struct tm並僅在需要時進行更新;下面FUNC不是線程安全的......還我見過的CPU時間只有6至7%,可節省...緩存localtime_r()是否值得?

struct tm* custom_localtime (time_t now_sec) 
{ 

    static time_t cache_sec; 
    static struct tm tms; 

    if (now_sec != cache_sec) { 
     cache_sec = now_sec; 
     localtime_r(&cache_sec, &(tms)); 
    } 

    return(&tms); 
} 

其他細節: - 我的應用程序,使得超過3000 /秒的來電localtime_r()

發現了至少33%的CPU節省時間,當我緩存格式"2011-12-09 10:32:45"的時間戳字符串againttime_t

謝謝大家NOS,asc99c和米爾恰。

+2

什麼是你的價值標準? – Jon

+0

節省時間在我撥打localtime_r()時寫入日誌等的時間超過3000 /秒的情況下... – SparKot

+1

如果您將時間保存在您的事宜上,那麼請執行此操作。如果沒關係,不要這樣做。我們如何才能確定差異是否與你有關? – Jon

回答

1

我可能會提到你的問題3000 /秒的通話費率!做到這一點。我最近正在分析一代屏幕,它叫本地時間約1,000,000 * 10,000次。

嵌套循環本來可以有一些改進,但我所看到的大約85%的CPU時間是本地時間使用的。簡單地緩存結果,因此它只被稱爲10,000次,減少了85%的離線頁面生成時間,並且使其足夠快速。

1

「避免一個不真正需要的庫函數調用」是值得的。剩下的只是你在內存和速度之間的折衷。

既然你調用這個3000 /秒,你可能想要更進一步,並把這個函數作爲static inline放在一個頭文件中,並且(如果使用GCC)對條件使用分支預測提示,說明它是「不太可能」:

if (__builtin_expect(now_sec != cache_sec, 0))