我们的应用程序中有一个线程经常调用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(<ime);
localtime_r(<ime, &newtime);
}
}
编译并运行命令 time ./a.out 后,时区为 Asia/Shanghai 或 America/New_York。
- 亚洲/上海
真实0m1.838s
用户0m1.628s
系统0m0.206s - 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