2011-11-17 14 views
5

Wpadłem w interesującą zagadkę wydajności, ale zanim zacznę zagłębiać się w glibc i wprowadzać błędy w lewo iw prawo, chciałem tylko uzyskać wgląd w to, co może być.Wydajność strftime vs snprintf

Mam kod, który w jednej z funkcji wykonuje to:

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

Reszta kodu nie ma znaczenia dla tego pytania. Kiedy zastąpię to:

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); 

średnio otrzymuję 20% poprawy wydajności.

Czy ktoś wpadł na to? Czy ten system operacyjny jest specyficzny?

+0

Z jakiego systemu operacyjnego/kompilatora korzystasz? –

+3

Więc 'snprintf' jest bardziej wydajny niż' strftime' w twoim systemie. Nie będzie to uważane za "błąd". –

+6

'strftime' może mieć do czynienia z lokalizacją (robi to więcej niż' snprintf'). –

Odpowiedz

6

POSIX wymaga strftime, aby zadzwonić pod numer tzset() (lub zachowywać się tak, jakby to zrobił), co w systemie Linux będzie prawdopodobnie stat/etc/timezone i inne pliki, które jest powolne (w porównaniu do snprintf). Ustawienie zmiennej środowiskowej TZ generalnie da mu ogromne przyspieszenie.

Jak powiedziano w komentarzach, lokalizuje również wiadomość.

+0

Ustawienie zmiennej środowiskowej 'TZ' na nazwę/ścieżkę strefy prawdopodobnie nie pomoże, ale użycie opisu strefy w stylu POSIX, jak np.' EST5EDT, M3.2.0/2, M11.1.0/2 'z pewnością przyspieszy (kosztem wspierania różnic w historycznych różnicach DST). –

+0

Dziękuję. Faktem jest, że w GLIBC 2.11 problem został rozwiązany. Nie do końca pewna, jaka była najwcześniejsza wersja tego zdarzenia. – Karlson

Powiązane problemy