strftime performance vs. snprintf



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

有人遇到过这种情况吗? 此操作系统是否特定于?

POSIX要求strftime调用tzset()(或表现得好像它这样做了(,这在Linux系统上可能会统计/etc/timezone和其他文件,这很慢(与snprintf相比(。设置TZ环境变量通常会给它带来很大的提升。

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

最新更新