【時間測量】代碼已耗用時間的測量方法【linux/window】

來源:互聯網
上載者:User

一,返回單位為毫秒 

#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;}




相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.