【時間測量】程式碼執行時間的測量方法【linux/window】
#include<windows.h>
DWORD dwStart = GetTickCount();
// 測試程式碼
DWORD dwTime = GetTickCount() - dwStart;
注意:GetTickCount()精確度有限,跟CPU有關,一般精確度在16ms左右,最精確也不會精確過10ms,這就是說如果你的時間間隔在16ms以內的話,兩個時間相減為0,如果大於16ms且小於32ms的話,兩個時間相減為16ms(也不完全嚴格,有的時候會是15或者17,根據當時CPU的處理情況而定)。其實也就是說你得到的這個差是實際時間間隔除以16(具體是幾取決於你機器的處理能力,但是不會小於10),把餘數捨棄。
#include<time.h>
unsigned long start,stop;
start=time(NULL); //取值為秒
//你的程式
stop=time(NULL);
printf("執行時間:%ld",stop-start);
三,精確計時法
QueryPerformanceCounter()這個函式返回高精確度效能計數器的值,它可以以微妙為單位
計時.但是 QueryPerformanceCounter()確切的精確計時的最小單位是與系統有關的,所以,必
須 要 查 詢 系 統 以 得 到 QueryPerformanceCounter() 返 回 的 嘀 噠 聲 的 頻
率.QueryPerformanceFrequency()提供了這個頻率值,返回每秒嘀噠聲的個數.計算確切的時
間是從第一次呼叫 QueryPerformanceCounter()開始的
使用 window 作業系統本身提供的 API 介面,程式如下:
#include<windows.h>
LARGE_INTEGER Freq; LARGE_INTEGER start; LARGE_INTEGER end;
QueryPerformanceFrequency(&Freq); // 獲取時鐘週期
QueryPerformanceCounter(&start); // 獲取時鐘計數
你的程式
QueryPerformanceCounter(&end);
/*此處*1000,以毫秒為單位;*1000000 以微秒為單位*/
/*由於執行時間極短(可能是幾微秒),所以採用微秒為單位*/
printf("%d",(end.QuadPart-start.QuadPart)*1000000/Freq.QuadPart);
注意:1s=10^3ms(毫秒)=10^6μs(微秒)=10^9ns(納秒)=10^12ps(皮秒)=10^15fs(飛秒)=10^18as(阿秒)=10^21zm(仄秒)=10^24ym(么秒)
例子:
#include <stdio.h> #include<windows.h> int main() { LARGE_INTEGER Freq; //64位有符號整數值. LARGE_INTEGER start; LARGE_INTEGER end; QueryPerformanceFrequency(&Freq); // 獲取時鐘週期 “1次/秒”,記做Hz(赫茲)。1Hz就是每秒一次 QueryPerformanceCounter(&start); // 獲取時鐘計數 Sleep(1000);//毫秒為單位 QueryPerformanceCounter(&end); /*此處*1000,以毫秒為單位;*1000000 以微秒為單位*/ /*由於執行時間極短(可能是幾微秒),所以採用微秒為單位*/ /* 1s=10^3ms(毫秒)=10^6μs(微秒)=10^9ns(納秒) */ printf("%d",(end.QuadPart-start.QuadPart)*1000/Freq.QuadPart); return 0; }
四,如果是在linux平臺下面呢?
時間的測量有多種方式。一種是C語言庫函式 time(),它可以提供秒級的計時,比較粗糙。
一種是C語言庫函式gettimeofday(),大約可以精確到微妙,但會受到CPU排程的影響。
一種是時間戳計時器(Time Stamp Counter),可以達到納秒級計時精度。
1)time 命令 — 執行命令並計時
time find . -name "*.c" |xargs wc -l // 統計執行命令時間
real 0m33.748s
user 0m0.772s
sys 0m1.044s
(1)實際時間(real time): 從command命令列開始執行到執行終止的消逝時間;
(2)使用者CPU時間(user CPU time): 命令執行完成花費的使用者CPU時間,即命令在使用者態中執行時間總和;
(3)系統CPU時間(system CPU time): 命令執行完成花費的系統CPU時間,即命令在核心態中執行時間總和。
其中,使用者CPU時間和系統CPU時間之和為CPU時間,即命令佔用CPU執行的時間總和。實際時間要大於CPU時間,因為Linux是多工作業系統,往往在執行一條命令時,系統還要處理其它任務。
另一個需要注意的問題是即使每次執行相同命令,但所花費的時間也是不一樣,其花費時間是與系統執行相關的。
2)微秒級測量方法struct timeval
{
long tv_sec; //秒域
long tv_usec; //微妙域
}
(tvend.tv_sec-tvstart.tv_sec)+(tvend.tv_usec-tvstart.tv_usec)/1000000 = 以秒為單位的計時時間。
以下得到以微秒為計時單位的時間
#include <sys/time.h>
#include "stdio.h"
int main()
{
struct timeval tstart,tend;
gettimeofday(&tstart,NULL);
for(int i=0;i<10000;++i)
printf("");
gettimeofday(&tend,NULL);
long int use_useconds=1000000*(tend.tv_sec - tstart.tv_sec) + (tend.tv_usec - tstart.tv_usec);
printf("%ld\n",use_useconds);
return 0;
}