2

我们的应用程序中有一个线程经常调用localtime_r。我们发现从系统(Redhat 6)将时区从 America/New_york 更改为 Asia/Shanghai 时,线程性能下降了 20%。经过profile,我们发现是localtime_r造成了差异。

我还在我们的 HP G8 服务器上做了一个简单的测试。

#include <time.h>
#include <stdio.h>

int main(void)
{
    struct tm newtime;
    time_t ltime;
    char buf[50];
    for(int i=0;i<=1000000;i++)
    { 
       ltime=time(&ltime);
       localtime_r(&ltime, &newtime);
    }
}

编译并运行命令 time ./a.out 后,时区为 Asia/Shanghai 或 America/New_York。

  1. 亚洲/上海
    真实0m1.838s
    用户0m1.628s
    系统0m0.206s
  2. America/New_York
    real 0m0.608s
    用户 0m0.395s
    sys 0m0.211s

在这两种情况下都没有设置 TZ 环境。在配置文件之后,我发现 localtime_r 在将时区设置为 shanghai 时总是调用 __tzset_parsetz ,这会导致性能差异。

有没有人知道原因?顺便说一句,我将服务器上的时区重置如下。ln -sf /usr/share/zoneinfo/America/New_York /etc/localtime

4

0 回答 0