2012-11-12 45 views
1

在我的程序的頂部和末尾,我使用clock()來計算我的程序需要多長時間完成。不幸的是,它報告的時間似乎只有一半。我再次用「時間」命令檢查了這一點。C++:在Linux中使用時鐘(使用時鐘())不同步(由於OpenMP?)

我的方案報告: 在45.86s完成

時間命令報告: 真正0m22.837s 用戶0m45.735s SYS 0m0.152s

用我的手機給它的時間,它完成23秒(又名:「真實」時間)。 「用戶」時間是所有線程的總和,因爲我使用的是OpenMP,所以這很有意義。 (您可以在這裏閱讀:What do 'real', 'user' and 'sys' mean in the output of time(1)?

那麼,爲什麼clock()報告在「用戶」時間而不是「真實」時間?我應該使用不同的函數來計算我的程序運行了多久?作爲一個側面說明,Windows的clock()按預期工作,並在「真實」時間內報告。

+0

C++不會在問題的標題歸屬。而且,當你形成你的問題時,這與C++沒有多大關係。 –

+0

硬件雙核? – Arno

回答

6

用戶0m45.735s

clock()措施CPU時使用的過程(好,因爲它可以)每7.27.2.1

時鐘函數返回執行的最佳逼近自實施定義的時代開始以來,程序使用的處理器時間僅與程序調用相關。

而不是掛鐘時間。因此clock()報告接近user時間的時間,即time報告是正常且符合標準的。

要測量已用時間,如果您可以假設POSIX,則使用clock_gettime可能是最佳選擇,但標準函數time()也可以用於此目的,但不是非常精細。

+0

這是怎麼從OP寫什麼不同呢? – Pubby

+0

由於該問題被標記爲C++,因此時間選擇的一個選項是標準C++庫'',例如'std :: high_resolution_clock'或'std :: steady_clock'。 – bames53

2

我會建議clock_gettime使用CLOCK_MONOTONIC爲時鐘。

根據您具體的系統,應該給近微秒或更好的分辨率,如果(例如)有人設置,而你的程序運行的系統時間也不會做的有趣的事情。

0

我建議在OpenMP應用程序內部進行基準測試時,您需要使用便攜式OpenMP計時功能omp_get_wtime(),該函數返回一個double值,以及過去未指定點的秒數。調用它兩次並減去返回值以獲得流逝的時間。您可以致電omp_get_wtick()瞭解精確的時間測量。它返回計時器分辨率的double值 - 值更接近0.0指示更精確的定時器。