簡単な分析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結論:このように、効果は理想的です。誤差は極めて小さく,無視できる。