2013-01-15 15 views
37

私は関数のタイミングを測定するためにC++でtime.hを使用しています。正確な時間測定

clock_t t = clock(); 
someFunction(); 
printf("\nTime taken: %.4fs\n", (float)(clock() - t)/CLOCKS_PER_SEC); 

しかし、私は常に0.0000と見なされています。 clock()とtを別々に印刷した場合、同じ値になります。 C++で時間を正確に(ナノ秒のオーダーで)測定する方法があるかどうかを知りたい。私はVS2010を使用しています。

答えて

48

私は通常QueryPerformanceCounter機能を使用します。

例:Cで

LARGE_INTEGER frequency;  // ticks per second 
LARGE_INTEGER t1, t2;   // ticks 
double elapsedTime; 

// get ticks per second 
QueryPerformanceFrequency(&frequency); 

// start timer 
QueryPerformanceCounter(&t1); 

// do something 
... 

// stop timer 
QueryPerformanceCounter(&t2); 

// compute and print the elapsed time in millisec 
elapsedTime = (t2.QuadPart - t1.QuadPart) * 1000.0/frequency.QuadPart; 
+0

ありがとうございました。それは助けた –

2

またはC++、私は通常、以下のように行います。それはまだあなたが私は完全に同意することを、rtdsc機能

 struct timeval time; 
     gettimeofday(&time, NULL); // Start Time 

     long totalTime = (time.tv_sec * 1000) + (time.tv_usec/1000); 

      //........ call your functions here 

     gettimeofday(&time, NULL); //END-TIME 

     totalTime = (((time.tv_sec * 1000) + (time.tv_usec/1000)) - totalTime); 
+2

x + = y - x 意味しない、 x = y あなたのケースでは古い値を捨てるでしょう – foolo

+0

はい、それは 'totalTime =(...) - totalTime;'でなければなりませんgettimeofdayへの最初と2番目の呼び出しの差を計算します。間違っているのは '+ ='です。 –

+0

ありがとう@foolo、それはタイプミスです。私は訂正しました。 – hmatar

6

次のテキストを使用して検討することに失敗した場合、Optimizing software in C++(任意のC++プログラマのための良い読書)から引用されている -

時間測定してもよいです の時間間隔が短い場合は非常に高い解像度が必要です。 Windowsでは、 GetTickCountまたは QueryPerformanceCounterミリ秒の解像度を使用できます。多くの場合、 の高解像度は、 CPUのタイムスタンプカウンタを使用して取得することができます。これはCPUクロック周波数でカウントされます。

"クロック周波数が動的に変化し、割り込みとタスクスイッチのために の測定値が不安定になることがあります。"という問題があります。

auto begin = std::chrono::high_resolution_clock::now(); 

// code to benchmark 

auto end = std::chrono::high_resolution_clock::now(); 
std::cout << std::chrono::duration_cast<std::chrono::nanoseconds>(end-begin).count() << "ns" << std::endl; 

より関連性の値について、機能を複数回実行して平均値を計算するために良いです:

77

C++ 11には、あなたがナノ秒を取得するために使用できるchrono APIを導入

auto begin = std::chrono::high_resolution_clock::now(); 
uint32_t iterations = 10000; 
for(uint32_t i = 0; i < iterations; ++i) 
{ 
    // code to benchmark 
} 
auto end = std::chrono::high_resolution_clock::now(); 
auto duration = std::chrono::duration_cast<std::chrono::nanoseconds>(end-begin).count(); 
std::cout << duration << "ns total, average : " << duration/iterations << "ns." << std::endl; 

しかし、forのループを覚えておいて、beginend varを割り当てると、CPU時間もかかります。

+4

Windowsのみを対象としている場合、依然として 'QueryPerformanceFrequency'が良い選択です。実際、VS11とVS12の下での 'high_resolution_clock'は単に' system_clock'のtypdefであり、普通の解像度を提供します。 VS14でのみこれが最近修正されています。 https://connect.microsoft.com/VisualStudio/feedback/details/719443/c-chrono-headers-high-resolution-clock-does-not-have-high-resolution – user1735003