【问题标题】:strftime performance vs. snprintfstrftime 性能与 snprintf
【发布时间】:2011-11-17 20:53:41
【问题描述】:

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

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

【问题讨论】:

  • 您使用的是什么操作系统/编译器?
  • 所以snprintf 在您的系统上比strftime 更有效。这不会被视为“错误”。
  • strftime 可能需要处理本地化问题(比snprintf 更多)。
  • @SethCarnegie 这是在 RHEL 4 v3.4.6 上完成的,我今天稍后将在 Ubuntu 10.04 上进行测试。
  • @GregHewgill 我并没有将其视为一个错误,只是在寻找一个原因。

标签: c++ c performance strftime printf


【解决方案1】:

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

正如在 cmets 中所说,它还本地化消息。

【讨论】:

  • TZ 环境变量设置为区域名称/路径可能无济于事,但使用像 EST5EDT,M3.2.0/2,M11.1.0/2 这样的 POSIX 风格的区域描述肯定会加快速度(以支持为代价)历史 DST 规则差异)。
  • 谢谢。我实际上发现 GLIBC 2.11 已经解决了这个问题。不完全确定发生这种情况的最早版本是什么。
猜你喜欢
  • 1970-01-01
  • 2022-06-10
  • 2014-08-20
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 2013-01-15
  • 1970-01-01
相关资源
最近更新 更多