2011-11-17 73 views
5

我遇到了一個有趣的性能難題,但在我開始深入研究glibc並輸入錯誤之前,我只想得到任何可能在那裏的洞察。strftime性能vs snprintf

我有一些代碼中的一個功能做到這一點:

gettimeofday(&tv, 0); 
localtime_r(&tv.tv_sec, &local_tm); 
char result[25]; 
strftime(result, 24, "%Y-%m-%d %H:%M:%S", &local_tm); 

代碼的其餘部分是無關這個問題。當我用它替換它時:

gettimeofday(&tv, 0); 
localtime_r(&tv.tv_sec, &local_tm); 
char result[25]; 
snprintf(result, sizeof(result), "%04d-%02d-%02d %02d:%02d:%02d", 
     local_tm.tm_year+1900, local_tm.tm_mon+1, 
     local_tm.tm_mday, local_tm.tm_hour, local_tm.tm_min, 
     local_tm.tm_sec); 

平均而言,我獲得了20%的性能提升。

有沒有人遇到過這個?這個操作系統具體嗎?

+0

你在使用什麼操作系統/編譯器? –

+3

因此'snprintf'比你係統上的'strftime'更有效率。這不會被視爲一個「錯誤」。 –

+6

'strftime'可能不得不處理本地化(不止是'snprintf')。 –

回答

6

POSIX要求strftime調用tzset()(或者就像它做的那樣),在linux系統上可能會出現stat/etc/timezone和其他文件,這與snprintf相比很慢。設置TZ環境變量通常會給它一個很大的提升。

正如評論中所說,它也將本地化的消息。

+0

將'TZ'環境變量設置爲區域名稱/路徑可能無濟於事,但使用像EST5EDT,M3.2.0/2,M11.1.0/2這樣的POSIX風格區域描述必將加快速度代價是支持歷史DST規則差異)。 –

+0

謝謝。我發現GLIBC 2.11已經解決了這個問題。不完全確定這發生的最早版本是什麼。 – Karlson