1. 程式人生 > >tic/toc/cputime測試時間的區別

tic/toc/cputime測試時間的區別

cputime測試程式碼執行時間可能不及tic/toc準確是眾所周知的事情。本文並非舊話重提,而是期望起到拋磚引玉的效果,從而找到cputime與tic/toc內在的區別。望不吝賜教!

用tic/toc測試如下程式碼
  1. tic
  2. pause(10);
  3. t=toc
複製程式碼 會發現matlab處於busy狀態並持續10秒,然後輸出:

t =

   10.0007

然而用如下cputime測試:
  1. t1=cputime;
  2. pause(10);
  3. t2=cputime;
  4. t=t2-t1
複製程式碼 會發現matlab也會處於busy狀態並持續10秒,然後輸出:

t =

    0.1875

為何差別如此巨大? 於是本人閱讀了help,發現了:

Using tic and toc Versus the cputime Function

Although it is possible to measure performance using the cputime function, it is recommended that you use the tic and toc functions for this purpose exclusively. It has been the general rule for CPU-intensive calculations run on Microsoft Windows machines that the elapsed time using cputime and the elapsed time using tic and toc are close in value, ignoring any first time costs. There are cases however that show a significant difference between these two methods. For example, in the case of a Pentium 4 with hyperthreading running Windows, there can be a significant difference between the values returned by cputime versus tic and toc.


原來Mathworks自己也是推薦用tic toc,而非cputime,他們也發現了超執行緒奔四CPU用cputime測試時間跟tic toc差距很大,根據我個人的理解,這應該跟CPU多核間運算分配(多核CPU情況)、多執行緒之間運算分配(超執行緒CPU),以及CPU內部運算優化等多種因素有關。cputime測試的並非 程式碼實際執行時間,而是 CPU實際執行的時間。通過CPU內部多核間任務排程、執行緒間調動、cpu自身優化(如被稱為turbo睿頻的軟超頻技術等)等,每個cpu實際執行時間會大大低於程式碼執行時間,因而也就出現了cputime測試時間大大低於tic/toc的時間。比如你的電腦是雙核同時還支援超執行緒,那麼你用cputime測試的時間最大不會超過程式碼執行時間的1/4,實際情況中恐怕會更小。

然而,tic/toc是直接測試 程式碼實際執行時間
,不論cpu有多少核心、多少執行緒、做何種優化,tic/toc都會給出程式碼實際執行時間的總和,因此tic/toc可以比較準確反映程式碼的真實執行時間。正因為如此,Mathworkss自己也是推薦用tic toc,而非cputime。

如今是多核的時代,並且Intel絕大多數cpu同時支援超執行緒,稍微高階一定的cpu都支援turbo技術,那麼cputime測試的時間恐怕只會更加不準,所以,還是用tic toc把

以上純屬個人觀點,歡迎批評指正,以期進步!