【VC】VCプログラム実行時間試験関数

6738 ワード

1:Sleep関数
次の操作を行います.
sleep(1000)は、WindowsとLinuxで1000を表す意味が異なり、Windowsでは1000ミリ秒、つまり1秒を表す.
Linuxでは1000秒を表し、Linuxではミリ秒レベルの関数を使用してusleepを使用できます.
原理:sleep関数はsleep関数を呼び出すスレッドをスリープさせ、スレッドはタイムスライスを自発的に放棄する.指定した間隔が経過したら、スレッドを起動し、コードを実行し続けます.Sleep関数はタイミングの役割を果たすことができず,主な役割は遅延である.いくつかのマルチスレッドではsleep(0)が表示される可能性があります.その主な目的はタイムスライスを譲ることです.
精度:sleep関数の精度は非常に低く、システムが忙しいほど精度が低くなり、1秒休眠したり、3秒後に実行したりすることがあります.その精度は、スレッド自体の優先度、他のスレッドの優先度、およびスレッドの数などの要因に依存します.
 
2:MFCでのtimerイベント
次の操作を行います.
  1.呼び出し関数SetTimer()は、SetTimer(0100,NULL)が100ミリ秒の時間間隔であるように、タイミング間隔を設定する.
  2.アプリケーションにタイミング応答関数OnTimer()を追加し、時間経過時の操作を完了するために応答の処理文を追加します.
原理:sleep関数と同じです.異なるのはtimerがタイマであり、コールバック関数を指定でき、デフォルトはOnTimer()関数です.
精度:timerイベントの精度範囲はミリレベルで、システムが忙しいほど精度が悪くなります.
 
3:C言語でのTime
使用シヨウ:time_t t;time(&t);Time関数は、現在の時刻を取得します.
原理:time関数は主に現在の時間を取得するために使用されます.例えば、電子クロックプログラムを作ると、この関数を使用してシステムの現在の時間を取得することができます.
精度:秒レベル
 
4:COMオブジェクトのCOleDateTime,COleDateTimeSpanクラス
次の操作を行います.
  COleDateTime start_time = COleDateTime::GetCurrentTime();

  COleDateTimeSpan end_time = COleDateTime::GetCurrentTime()-start_time; 

  While(end_time.GetTotalSeconds() < 2) 

  {   

    //                   

    DoSomething() end_time = COleDateTime::GetCurrentTime-start_time;

  }

原理:以上は遅延2秒を表していますが、この2秒以内にDoSomething()をループして呼び出すことができ、実際に遅延したときに他の関数やメッセージを処理することができます.COleDateTime,COleDateTimeSpanはMFCにおけるCTime,CTimeSpanはCOMにおける応用であるため,上記の方法はCTime,CTimeSpaに対しても同様に有効である.
精度:秒レベル
 
5:C言語でのクロックサイクルclock()
次の操作を行います.
  clock_t start = clock();               

  Sleep(100);              

  clock_t end = clock();           

  double d = (double)(start - end) / CLOCKS_PER_SEC;

原理:clock()は、コンピュータの起動後の時間間隔を取得します. 
精度:msレベルは、短時間でのタイミングまたは遅延に対してmsレベルに達することができ、時間が比較的長いタイミングまたは遅延精度では十分ではありません.WindowsでCLOCKS_PER_SECは1000です.
 
6:WindowsでのGetTickCount()
次の操作を行います.
 DWORD start = GetTickCount();        

 Sleep(100);        

 DWORD end = GetTickCount();

原理:GetTickCount()はシステム起動後の時間間隔を取得する.関数開始タイミングに入ることにより、関数終了タイミングになるまで、関数の実行時間を判断することができるが、この時間も関数やアルゴリズムの実際の実行時間ではない.関数やアルゴリズムスレッドでCPUをずっと占有することは不可能であるため、実行時間を判断するすべての関数については同じであるが、基本的には正確である.クエリーでタイミングを決めることができます.GetTickCount()とClock()関数は、マザーボードBIOSにreal time clock時間を要するため、割り込みが発生し、遅延の問題があります.
精度:WindowsNT 3.5以降のバージョンの精度は10 msであり、clock関数よりも時間精度が高く、GetTickCount()はマルチメディアでよく使用されます.
 
7:Windows下timeGetTime
使用:Mmsystemを含める必要があります.h,Windows.h,静的ライブラリWinmmを加える.lib.
  timeBeginPeriod(1); 

  DWORD start = timeGetTime();               

  Sleep(100);          

  DWORD end = timeGetTime(); 

  timeEndPeriod(1);

原理:timeGetTimeはマルチメディアタイマにもよく使われ、クエリーでタイミングを決めることができます.クエリーによるタイミングは、タイマーのタイミング精度にも影響します.
精度:ミリ秒、GetTickCount()に相当します.ただしGetTickCountと比較してtimeGetTimeはtimeBeginPeriod,timeEndPeriodでタイマーの最小解析精度を設定でき,timeBeginPeriod,timeEndPeriodはペアで出現しなければならない.
 
8:windowsでのtimeSetEvent
使用:まだ覚えているVCの下のTimerですか?Timerは1つのタイマーですが、以上ではいくつかの時間関数やタイプについて言及しましたが、実現タイミング機能は輪訓でしか実現できません.つまり、別のスレッドを作成して単独で処理しなければなりません.これはタイミング精度に影響します.windowsには内蔵のタイマーtimeSetEventが提供されています.関数の原型は
MMRESULT timeSetEvent( UINT uDelay, //           

              UINT uResolution, //          ,              。    1ms 

              LPTIMECALLBACK lpTimeProc, //         

              WORD dwUser, //            

              UINT fuEvent )//     ,TIME_ONESHOT:    ;TIME_PERIODIC:     

具体的には、timeSetEvent()関数を呼び出すことで、周期的に実行する必要があるタスクをlpFunctionコールバック関数(タイミングサンプリング、制御など)に定義し、処理するイベントを完了することができます.タスク処理の時間は、サイクル間隔時間より大きくしてはならないことに注意してください.また、タイマーの使用が完了したら、timeKillEvent()を呼び出して解放します.
原理:代コールバック関数として理解できるtimeGetTime
精度:ミリ秒、timeSetEventはtimeBeginPeriod、timeEndPeriodによってタイマーの最小解析精度を設定することができ、timeBeginPeriod、timeEndPeriodはペアで表示する必要があります.
 
9:高精度時制御関数QueryPerformanceFrequency,QueryPerformanceCounter
次の操作を行います.
LARGE_INTEGER m_nFreq;           

LARGE_INTEGER m_nBeginTime;           

LARGE_INTEGER nEndTime;      

QueryPerformanceFrequency(&m_nFreq); //                  

QueryPerformanceCounter(&m_nBeginTime); //                  

Sleep(100);           

QueryPerformanceCounter(&nEndTime);      

cout << (nEndTime.QuadPart-m_nBeginTime.QuadPart)*1000/m_nFreq.QuadPart << endl;

原理:CPUにもカウンタがあり、機器のclock単位でrdtscで読み取ることができ、中断することなく精度がシステム時間に相当する.
精度:コンピュータはハードウェアサポートを取得し、精度が高く、他の時間関数の精度範囲を判断することができます.
 
10まとめ:
以上、一般的な9種類の時間関数について述べたが、彼らの用途が異なるため、彼らの精度も異なるため、簡単な遅延はsleep関数を使用することができ、少し正確な遅延はclock関数、GetTickCount関数、より高度な実用的なtimeGetTime関数を使用することができる.簡単なタイミングイベントはTimerを使うことができて、正確にtimeSetEventを使うことができます;あるいは一般的なシステム時間をとるとtime、あるいはCTime、あるいはCOleDateTimeに通じることができ、正確な時間を得るにはclock、あるいはGetTickCount関数、あるいはtimeGetTime関数を使うことができ、正確なシステム時間を得るにはハードウェアでサポートされているQueryPerformanceFrequency関数、QueryPerformanceCounter関数を使用しなければならない.
 
原文住所:http://hi.baidu.com/20070210030205/item/ee4a9bd001392e342a35c70d