strftime性能 vs. snprintf

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%的性能提升。

有人遇到过这种情况吗?这是与操作系统有关吗?


3
在您的系统上,snprintfstrftime更有效率。这不会被视为“错误”。 - Greg Hewgill
6
strftime可能需要处理本地化(比snprintf更多)。 - Basile Starynkevitch
@SethCarnegie 这是在 RHEL 4 v3.4.6 上完成的。我稍后今天会在 Ubuntu 10.04 上进行测试。 - Karlson
我明白了。我想我被你的“开始……到处输入错误”误导了。 - Greg Hewgill
我遇到了同样的问题,进行了更多的测试,并创建了这个Gist,其中包含代码和结果:https://gist.github.com/felipou/ad107bbb3a91814679beb22c0686fbeb - felipou
显示剩余2条评论
1个回答

6

POSIX要求strftime调用tzset()(或者类似于调用),在Linux系统上,这将可能会访问/etc/timezone等文件,因此速度较慢(与snprintf相比)。设置TZ环境变量通常可以显著提高速度。

正如评论中所说的那样,这也会本地化消息。


TZ环境变量设置为区域名称/路径可能没有帮助,但使用类似于EST5EDT,M3.2.0 / 2,M11.1.0 / 2的POSIX样式区域描述肯定会加快速度(以支持历史DST规则差异为代价)。 - R.. GitHub STOP HELPING ICE
谢谢。我实际上发现GLIBC 2.11已经解决了这个问题。不确定这个问题最早出现在哪个版本。 - Karlson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接