2012-05-30 38 views
1

我正在使用clock()來測量算法的CPU時間量。爲什麼在測量CPU時間時使用clock()獲得負數

的代碼是這樣的:

start_time = clock(); 
//code to be timed 
. 
end_time = clock(); 
elapsed_time = (end_time - start_time)*1000/CLOCKS_PER_SEC; 

printf("Time taken %d seconds %d milliseconds\n", elapsed_time/1000, elapsed_time%1000); 

,但我得到 「0秒-175毫秒」 的結果。我不明白爲什麼。 而且似乎「1秒349毫秒」在過去的時間內確實需要10分鐘或更長時間。 這是常見的嗎?

+0

你是否想要一個分叉的程序? – nhahtdh

+0

是的,那正是我想要做的。 –

+0

請向我們展示更多代碼 - 包括變量的類型等。並確保您在這裏展示的內容與您正在編譯和測試的代碼完全相同(例如,如果將printf更改爲使用%lld ,在這裏顯示)。同時告訴我們您正在使用哪種平臺(以及您是否正在構建32位或64位體系結構)。 – abarnert

回答

0

如果START_TIME和END_TIME是32位整數,他們只能翻身成負數之前持有約2147秒(約35分鐘),因爲CLOCKS_PER_SEC是1000000

但比這更糟糕,因爲你將差值乘以1000,這意味着如果超過2.147秒,它將溢出。另一方面,如果它們不是32位整數,則使用錯誤的printf格式說明符(並且您可能會忽略來自編譯器的警告),所以您會看到垃圾。

+0

他們都是「clock_t」的類型。是否會溢出?是的,我會再次嘗試使用「%f」。謝謝! –

+0

IIRC,clock_t是無符號長整型,這意味着您的算術將在32位版本中溢出,而您的printf將在64位版本中打印垃圾。而且......我希望這不是侮辱你的智慧,但切換到%f是不會有幫助的,除非你也將所有變量切換到雙打。 – abarnert

1

分叉是一種特殊情況,這種類型的代碼會導致負面的時間。其中一個原因是,clock()將返回自程序啓動以來的時鐘滴答數。

就像提醒一樣,start_time中的值將被複制到子進程。

  • 對於父進程,時間應該是正值。由於start_timeend_time的時鐘滴答計數爲相同的過程。

  • 對於孩子的過程,因爲它只有在fork()開始clock()將返回時鐘的數量打勾,該方案從這時起運行。沒有記錄fork()之前的時間。

    由於用於計數時鐘滴答的起始參考是不同的:

    • start_time是因爲過程的開始,直到第一clock()
    • end_time時鐘滴答數是時鐘的數目自開始至第二個clock()

    可能會導致負面結果。如果子進程運行的時間足夠長以超過父進程啓動的時間量,那麼也可能產生積極的結果。

編輯

我不知道該預期時間是什麼,但如果你想計算:時鐘從開始到結束父進程的蜱,並從fork()後子進程的時鐘滴答結束,然後修改您的代碼,以在子進程中使用新值clock()覆蓋start_time。或者你可以將start_time設置爲0.

+0

嗨nhahtdh,我禁止多線程。所以它不應該是叉子的情況下,對吧? –

+0

我不明白。程序運行多長時間?你是否會在兩者之間產生線程/進程? – nhahtdh

+0

我的意思是我禁用了線程池的使用。它運行了大約一個小時。 –

相關問題