2017-06-12 113 views
4

我試圖測量在我的代碼中執行特定功能所用的時間。最初,我使用的clock()功能如下由時鐘和steady_clock測量的時間差

clock_t start = clock(); 
do_something(); 
clock_t end = clock(); 

printf("Time taken: %f ms\n", ((double) end - start)*1000/CLOCKS_PER_SEC); 

後,我在C++11閱讀有關chrono庫並試圖測量同一個std::chrono::steady_clock如下

using namespace std::chrono; 

auto start = steady_clock::now(); 
do_something(); 
auto end = steady_clock::now(); 
printf("Time taken: %lld ms\n", duration_cast<milliseconds>(end - start).count()); 

由第一代碼測量的時間片段(使用clock)爲89.53 ms,並且由steady_clock測量的結果爲1140 ms

爲什麼兩個時鐘測量的時間差異如此之大?

+0

如果可能,您可以創建[mcve]嗎? – Rakete1111

+0

@ Rakete1111:這裏是[鏈接](http://coliru.stacked-crooked.com/a/9f74e57079978629)到一個小的測試用例,其中問題是可重現的。 –

回答

5

clock測量處理器時間,而steady_clock測量物理時間。所以如果do_something()被其他進程搶佔(比如檢查郵件或其他),你可以得到這樣的差異。

Daniel H在下面的評論中提出了一個很好的觀點,如果do_something()沒有CPU綁定,這也會發生。例如,如果它睡覺,阻塞鎖定互斥鎖,等待條件變量等。

+2

這也會顯示id'do_something'不是CPU綁定的,對吧? –

+0

@丹尼爾:謝謝丹尼爾,好點。我已將您的評論添加到我的答案中。 –

+0

@HowardHinnant測量一個函數可以睡眠,阻塞互斥等時間的正確方法是什麼? –