C++程式已耗用時間

來源:互聯網
上載者:User

在C++程式的效能分析中,其中重要的一項就是程式的已耗用時間。雖然程式的運行速度與電腦的配置、電腦的目前狀態等有很大關係,但在相對一致的外部環境下,程式已耗用時間的長短在很大程度上是可以反映程式效率的。

1.一般計時方法

在ctime標頭檔中,C++提供了計時函數 clock() ,其返回資料類型為 clock_t。

typedef   long   clock_t;

clock()函數返回從“開啟程式進程”到“程式中調用clock()函數”這段時間裡,CPU時鐘計時單元(clock tick)的數目,在MSDN中稱之為掛鐘時間(wal-clock)。
在ctime檔案中,還定義了一個常量CLOCKS_PER_SEC,它用來表示一秒內有多少個CPU時鐘計時單元。
通過clock()/CLOCKS_PER_SEC便可以得到進程的已耗用時間,一般CLOCKS_PER_SEC的值為1000,可見計時精度可達小數點後3位(毫秒級)。

#define CLK_TCK  CLOCKS_PER_SEC

計時的簡單樣本如下

/* *作者:侯凱 *說明:clock()計時函數 *日期:2013-6-6*/#include <ctime> //計時用的標頭檔#include <iostream>using namespace std;int main(){    long i = 10000000L;    clock_t start, end;         start = clock();     while( i-- );//需要計時的程式段    end = clock();     printf("The time was: %f\n", (double)(end - start) / CLK_TCK);     system("pause");    return 0;}

2.精確計時方法

這裡精確的含義是計時的精度更高,為了達到更高的計時精度,需要使用精確時間函數QueryPerformanceCounter()和QueryPerformanceFrequency(),它們需要電腦從硬體上支援精確定時器。當然,現在電腦一般都是支援的。
QueryPerformanceCounter()函數返回高精確度計數器的脈衝數目(計時數),QueryPerformanceFrequency()函數提供了高精度計時器的頻率值,即每秒脈衝數。

bool  QueryPerformanceFrequency (LARGE_INTEGER *lpFrequency);bool  QueryPerformanceCounter (LARGE_INTEGER *lpCount);

其中,資料類型LARGE_INTEGER既可以是一個8位元組長的整型數,也可以是兩個4位元組長的整型數的聯合結構, 其具體用法根據編譯器是否支援64位而定。該類型的定義如下:

typedef union _LARGE_INTEGER{     struct     {       DWORD LowPart ;// 4位元組整型數        LONG  HighPart;// 4位元組整型數     };     LONGLONG QuadPart ;// 8位元組整型數      }LARGE_INTEGER ;

在進行定時之前,先調用QueryPerformanceFrequency()函數獲得機器內部定時器的時鐘頻率,然後在需要嚴格定時的事件發生之前和發生之後分別調用QueryPerformanceCounter()函數,利用兩次獲得的計數之差及時鐘頻率,計算出事件經曆的精確時間。其過程與clock()方法類似,但這裡的時鐘頻率很高,測試電腦上頻率的QuadPart值為3118031,其精度原高於clocK()。
為了更好地使用這種計時方式,已將其封裝成HpTime類,下載。使用該類,計時程式如下

/* *作者:侯凱 *說明:HpTime類高精度計時 *日期:2013-6-6*/#include "hptime.h"#include <iostream>using namespace std;int main(){    long i = 10000000L;    HpTime hpTime;        while( i-- );//要計時的函數段     printf("The time was: %f\n", hpTime.sec());     system("pause");    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.