2013-01-15 87 views
37

我在C++中使用time.h來測量函數的時間。精確時間測量

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

但是,我總是得到的時間爲0.0000。時鐘()和t分別打印時,具有相同的值。我想知道是否有方法可以在C++中精確地測量時間(可能爲納秒級)。我正在使用VS2010。

回答

48

我通常使用QueryPerformanceCounter函數。

例如:

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或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;'to計算第一次和第二次gettimeofday調用之間的差異。這是錯誤的'+ ='。 –

+0

謝謝@foolo,這是一個錯字。我已糾正。 – hmatar

6

下面的文本,我完全同意,從Optimizing software in C++(良好的閱讀任何C++程序員)報價 -

的時間測量可如果時間間隔短,則需要非常高的分辨率。在Windows中,您可以使用毫秒分辨率的函數 GetTickCountQueryPerformanceCounter函數。使用 CPU中的時間戳計數器可以獲得更高的分辨率,該計數器在CPU時鐘頻率下計數。

存在一個問題:「時鐘頻率可能動態變化,並且由於中斷和任務切換導致測量結果不穩定。」

77

C++ 11引入了chrono API,你可以用它來獲得納秒:

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; 

對於更相關的值這是很好的運行函數幾次並計算平均值:

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