Linux: 高精度の時刻を取得する

        Linux では時間を取得するための関数がたくさんありますが、そのほとんどはカーネルを呼び出す必要があり、非常に高いパフォーマンスが必要なプログラムは要件を満たしていない可能性があり、一般的な API を置き換えるには特別な方法が必要です。

1、現地時間

時間関数、1970 年から現在までの秒数を取得します。精度は秒単位で、現地時間で変換されます

time_t testtm;
時間(&testtm);
testtm = 時間 (NULL);
struct tm *ptm ;
ptm = localtime(&testtm);
struct tm ptm = { 0 }; 
localtime_r(&testtm, &ptm); 

       : localtime はスレッドセーフではありません。代替関数localtime_r が複数のスレッド間で使用され、スレッドセーフです。localtime は再入可能ではなく、複数の呼び出しが上書きされます。localtime がポインターを返すことも戻り値からわかるため、このポインターのデータ ストレージが大きな問題になり、複数のスレッドが同じポインターにアクセスし、複数の呼び出しによって上書きされます。また、localtime_r は構造体を渡し、構造体がそれをコピーするので、相互影響の問題はありません。したがって、さまざまな予期しない問題を回避するために localtime を使用しないでください。

        シグナル応答関数で localtime または localtime_r を使用しないでください。スタックが発生します。

2、gettimeofday

        これはミリ秒レベルを取得するための API です。

3、clock_gettime

        これは、ナノ秒レベルでデータを返すことができ、特定のシステム時間 (1970 年から現在までの秒数も) または電源がオンになってからのシステムの実行時間を返すことができます。

struct timespec mtime;
clock_gettime(CLOCK_MONOTONIC, &mtime);
tm nowTime;
localtime_r(&mtime.tv_sec, &nowtime);

CLOCK_REALTIME と CLOCK_MONOTONIC は、それぞれ特定の時間またはマシンの実行時間に対応します。

4・rdtsc

        rdtsc は、Intel の x86_64 アーキテクチャでのみ使用できる CPU の動作サイクル数です。他の CPU アーキテクチャについては、他の使用法を確認してください。この値は、CPU の周波数に関連しています。1Ghz は 10 億ヘルツ (1,000,000,000 Hz) に等しく、1 秒間にカウントが 10 億倍増加することを意味します。

uint64_t get_tsc()
{     uint64_t mlow, mhigh;     __asm__ volatile("rdtsc" : "=a" (mlow), "=d" (mhigh));     戻る (mhigh << 32) | 遅い; }



        このメソッドは、現在の CPU カウント (64 ビット) の上位 32 ビットをレジスタに格納し、下位 32 ビットをアセンブリによって別のレジスタに格納し、それを取り出して使用します。
        自分で変更する場合、アセンブリ ライン=aおよび=dは変更できず、定義した変数 mlow および mhigh のみを置き換えることができることに注意してください。

        この方法は性能が良いだけでなく、精度も高く、カーネルを経由しないため、上記の clock_gettime よりは性能が良いのですが、時間 localtime よりは少し悪いです、やはり時間 localtime の精度はが低すぎる。
        これの使用法は、通常、プログラムを開始し、1 秒または 10 秒間スリープ状態にしてから、現在のシステムが 1 秒または 1 ミリ秒のカウント数を累積するまでこの値を計算することです。

        注: rdtsc は CPU の動作周波数ですが、同じコンピューターの CPU と別のコアでは CPU 周波数が異なる場合があるため、CPU コア全体でこの値を使用しないことをお勧めします。回、その
        周波数が変更されるため、CPU の周波数をロックする必要があります。

5・constant_tsc

上記の rdtsc の問題を解決するために、新しいカーネルではこのパラメーターが提供されます。つまり、異なるコアの違いによる計算値の不一致を心配することなく、気軽に使用できます。
特定のシステムがそれをサポートしているかどうかは、cat /proc/cpuinfo|grep constant_tscそれを使用して確認できます。

6・rdtscp

rdtsc または constant_tsc の使用には別の問題があります。つまり、命令の最適化のために順序が正しくない可能性があり、不正確になる可能性があります。非常に高い時間要件がある場合は、rdtscp を使用できます。

7. まとめ

おおよその効率
時間(5.65) > rdtsc(8.81) > rtdscp(15.95) > gettimeofday(22.70) > clock_gettime(23.87)

おすすめ

転載: blog.csdn.net/hhd1988/article/details/129597096