アプリケーションには localtime_r を頻繁に呼び出すスレッドが 1 つあります。システム (Redhat 6) からタイムゾーンを America/New_york から Asia/Shanghai に変更すると、スレッドのパフォーマンスが 20% 低下することがわかりました。プロファイルの後、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
リアル 0m0.608s
ユーザー 0m0.395s
sys 0m0.211s
どちらの場合も TZ env は設定されていません。プロファイルの後、パフォーマンスの違いを引き起こす上海としてタイムゾーンを設定すると、常に localtime_r が __tzset_parsetz を呼び出すことがわかりました。
理由を知っている体はありますか?ちなみに、サーバーのタイムゾーンを次のようにリセットしました。ln -sf /usr/share/zoneinfo/America/New_York /etc/localtime