2013-01-31 56 views
8

我編寫了一些C代碼,我使用MEX編譯後稱之爲MATLAB。內的C代碼,我使用下面的代碼測量的計算的部分的時間:MATLAB的tic-toc&C的時鐘差異

clock_t begin, end; 
double time_elapsed; 
begin = clock(); 
/* do stuff... */ 
end = clock(); 
time_elapsed = (double) ((double) (end - begin)/(double) CLOCKS_PER_SEC); 

經過時間應該在秒的執行時間。

然後我輸出值time_elapsed到MATLAB(它已正確導出;我檢查過)。然後MATLAB端調用這個C函數(在我使用MEX編譯之後),並使用tictoc來測量它的執行時間。結果是一個完全荒謬的是,我用tic和toc計算的時間是0.0011s(500次運行時的平均值,st。dev.1.4e-4),而C代碼返回的時間是0.037s(平均500次運行,st。dev。0.0016)。

在這裏,人們可以發現兩個很奇怪的事實:

  1. 的執行時間整體功能比執行時間碼的一部分低。因此,無論是MATLAB還是C的測量都非常不準確。
  2. 在C代碼中測量的執行時間非常分散,並且表現出非常高的st。偏差(變異係數爲44%,而tic-toc僅爲13%)。

這些計時器是怎麼回事?

+0

什麼是時鐘的分辨率是多少?我們如何知道'begin = clock();'是在時鐘週期之前還是之後執行?這會影響結果嗎?大概。 –

+0

@BoPersson所以,你的意思是'時鐘()'可以在最想念蜱? –

+4

我的意思是說一個勾號可能會大到影響結果。像18毫秒。 –

回答

6

你在比較蘋果和橘子。

看看Matlab的文檔:

抽動 - http://www.mathworks.com/help/matlab/ref/tic.html
TOC - http://www.mathworks.com/help/matlab/ref/toc.html

抽動TOC讓你衡量實際經過的時間。

現在看看時鐘功能http://linux.die.net/man/3/clock

特別地,

時鐘()函數返回一個近似的程序所使用的處理器時間

返回的值是目前使用的CPU時間作爲clock_t;到 得到所用秒數,除以CLOCKS_PER_SEC。如果使用的處理器時間不可用或其值不能爲 表示,則函數返回值(clock_t)-1。

那麼可以考慮您的區別:

  • CPU時間和實際經過的時間(由TIC和TOC測量)(由時鐘()測量)是不一樣的。所以你會期望cpu時間比經過的時間少?也許。如果在0.0011s內,你會以100%的速度驅動10個內核?這意味着clock()測量值是用tic和toc測量的10倍。可能,不太可能。
  • 時鐘()是非常不準確,並與文檔一致的,它是一個近似 CPU時間測量!我懷疑它與調度器的量子大小掛鉤,但我沒有深入Linux內核代碼來檢查。我也沒有檢查其他操作系統,但this dude's blog是符合那個理論。

那麼對於初學者做...,逐個比較!接下來,請確保您考慮到計時器分辨率。