最近在幫研究論文成果算時間,需要計算程式所耗費的時間;本來是用標準的 time.h 來處理,但是為了取得更精準的時間,需要取到毫秒(millisecond, 10^-3),原本的就不適合了。
找了一下發現要用系統的 ticks 來計算; ticks 是從系統開始運行後 CPU 跑的圈數,所以 ticks 數除上 CPU 的速度,就是經過的時間;以現在的電腦來說,精準度都可以達到 nanosecond(10^-9) 才對。
以下是程式的寫法:
LARGE_INTEGER ticksPerSecond;
LARGE_INTEGER start_tick;
LARGE_INTEGER end_tick;
double elapsed; // 經過時間
QueryPerformanceFrequency(&ticksPerSecond); // CPU 每秒跑幾個 ticks
QueryPerformanceCounter(&start_tick); // 開始時系統計數器位置
myfunc(); // 要測試的 function call
QueryPerformanceCounter(&end_tick); // 結束時系統計數氣位置
elapsed = ((double)(end_tick.QuadPart – start_tick.QuadPart) / ticksPerSecond.QuadPart); // 經過的時間, 依自己程式需求選擇精準度
接下來就可以再用 elapsed 去算其他數據了。
好吧,我承認我自己覺得問這個問題很丟臉,所以 blog 一下來賺流量…
Pingback: 抓~ 抓到一隻瞌睡蟲 Blogger 分站
Pingback: 抓~ 抓到一隻瞌睡蟲
您好,
提醒一下,microsecond應是 1E-6 second,1E-9 second是nanosecond。
Solomon,
謝謝您的提醒,已經修正了 :>
vb 中可用這個宣告,取得到毫秒的時間。我想你也可用這個DLL的函數。
Private Declare Function timeGetTime Lib “winmm.dll” () As Long
我用了你的方法,可以得到nanosec的elapsed time. 我还想请问,call function QueryPerformanceCounter() 会不会引起overhead?
Pingback: 在 Win32 下抓取時間 [JeffHung.Blog]
Pingback: MidiMall Forum ::
Pingback: high resolution time « Life is not enough