代碼運行時間的測量方法【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;
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章