2

アプリケーションには 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(&ltime);
       localtime_r(&ltime, &newtime);
    }
}

コマンド time ./a.out をコンパイルして実行した後、タイムゾーンを Asia/Shanghai または America/New_York に設定します。

  1. アジア/上海
    実質 0m1.838s
    ユーザー 0m1.628s
    システム 0m0.206s
  2. 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

4

0 に答える 0