8

我遇到了一个有趣的性能难题,但在我开始研究 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% 的性能提升。

有没有人遇到过这个?这个操作系统是特定的吗?

4

1 回答 1

6

POSIX 需要strftime调用tzset()(或像调用一样),这在 linux 系统上可能会统计 /etc/timezone 和其他文件,这很慢(与 snprintf 相比)。设置TZ环境变量通常会给它很大的提升。

正如评论中所说,它还本地化了消息。

于 2011-11-17T21:42:24.347 回答