簡介
CPU時間即反映CPU全速工作時完成該進程所花費的時間
計算方法
一、計算算法的CPU運行時間
(一)一般有這么幾個函式可以使用:
<time.h> 中的std的clock() 可以精確到1ms
<windows.h> 中的win下常用的GetTickCount可以精確到18-20ms
當然這些都不是C或是C++標準支持的。
(二)我們先來看看clock()的用法:
#include <time.h>
#include <stdio.h>
int main()
{
time_t t; //一定要這個類型
long i;
t = clock();
for (i = 0; i < 1024 * 32768; ++i) ; //做些耗時的事情,可能就是你的算法
printf("time consumed: %d ms", clock() - t); //這樣輸出的就是耗時的毫秒數了
return 0;
}
GetTickCount()用法類似。
(三)現在我們來介紹一個精度更加高的方法,直接讀取CPU開機以來執行的機器周期數。
我們要用到一條彙編指令:RDTSC (就是ReaD TimeStamp Count) 其精度可以達到ns級別。(準確地說精度是1/你的CPU的時鐘頻率,這也是極限)
long hStart, lStart, hEnd, lEnd;
//分別代表開始的高位和低位以及結束的高位和低位,由於NS精度實在太高,所以數值會很大,1個32位的變數無法存儲,需要兩個32位變數
long hCnt, lCnt;//差值的高位和低位
__asm //內嵌彙編的語法可能不同編譯器有些不同
{
RDTSC
mov hStart, edx
mov lStart, eax
}
//此處放上耗時的代碼
__asm
{
RDTSC
mov hEnd, edx
mov lEnd, eax
//獲取兩次計數器值得差
sub eax, lStart
cmp eax, 0
jg L1
neg eax
jmp L2
L1: mov lCnt, eax
L2: sub edx, hStart
mov hCnt, edx
}
unsigned long timer = (hCnt < <32) + lCnt; //得出最終結果,timer就是所得的差值(單位ns)