производительность по сравнению с snprintf - PullRequest
7 голосов
/ 18 ноября 2011

Я столкнулся с интересной загадкой производительности, но перед тем, как начать изучать glibc и вводить ошибки влево и вправо и в центр, я просто хотел получить представление о том, что может быть там.

У меня есть код, который в одной из функций делает это:

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%.

Кто-нибудь сталкивался с этим? Эта ОС специфична?

1 Ответ

6 голосов
/ 18 ноября 2011

POSIX требует strftime для вызова tzset() (или действовать так, как если бы он это делал), что в системе linux, скорее всего, будет составлять / etc / timezone и другие файлы, что является медленным (по сравнению с snprintf).Установка переменной окружения TZ, как правило, значительно ее увеличивает.

Как было сказано в комментариях, она также локализует сообщение.

...