簡単な分析Linuxの正確な制御時間の関数


時間をテストするだけならいいですが、時間制御の種類の関数をプログラムに使えば、timeのようになります。  gettimeoff day自身はまだ多くの時間を消費して、プログラム実行のコストを増加して、このように得た時間は正確ではありません。この場合には、CPU心拍の関数を用いて時間を処理し、カプセル化された関数を用いて時間が正確になり、使用が便利になる。欠点:ハードウェアのため、CPUの心拍数rdtscpll関数の使用をサポートしないマシンがあります。 使用状況:私がセットトップボックスのテストツールをする時、この方法を使って各秒の接続ユーザー数(一秒ごとに100人のユーザを接続する)を制御します。テスト効果は理想的で、基本的には1秒ごとに100人のユーザーがオンラインします。関数コードを下に貼り付けます。

#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <asm/msr.h>
long long g_var_llOneSecJiffiesCount = 0;
long long GetCurCpuHopCount()
{
        long long llcurrentcpuhopcount;
        int iaux;
        rdtscpll(llcurrentcpuhopcount,iaux);
        return llcurrentcpuhopcount;
}
int main(int argc, char* argv[])
{
        long long llstartvalue = 0;
        long long llendvalue = 0;
        struct timeval starttm,endtm;
        int iaux = 0;
        gettimeofday(&starttm,NULL);
        rdtscpll(llstartvalue,iaux);
        sleep(3);
        rdtscpll(llendvalue,iaux);
        gettimeofday(&endtm,NULL);
        g_var_llOneSecJiffiesCount = ((llendvalue-llstartvalue)*1000000/(endtm.tv_sec*1000000-starttm.tv_sec*1000000+endt
m.tv_usec-starttm.tv_usec));//
        long long begin_time = GetCurCpuHopCount();
        sleep(100);//
        long long end_time = GetCurCpuHopCount();
        long long use_time = (end_time - begin_time) * 1000000 / g_var_llOneSecJiffiesCount;
        printf(" use time(us): %lld
",use_time);
        return 0;
}
実行結果:機能use timeをテストします。100,002,362結論:このように、効果は理想的です。誤差は極めて小さく,無視できる。