1. 程式人生 > >【時間測量】程式碼執行時間的測量方法【linux/window】

【時間測量】程式碼執行時間的測量方法【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;
}