在C++程序的性能分析中,其中重要的一項就是程序的運行時間。雖然程序的運行速度與計算機的配置、計算機的當前狀態等有很大關系,但在相對一致的外部環境下,程序運行時間的長短在很大程度上是可以反映程序效率的。
在ctime頭文件中,C++提供了計時函數 clock() ,其返回數據類型為 clock_t。
typedef clock_t;
clock()函數返回從“開啟程序進程”到“程序中調用clock()函數”這段時間裡,CPU時鐘計時單元(clock tick)的數目,在MSDN中稱之為掛鐘時間(wal-clock)。
在ctime文件中,還定義了一個常量CLOCKS_PER_SEC,它用來表示一秒內有多少個CPU時鐘計時單元。
通過clock()/CLOCKS_PER_SEC便可以得到進程的運行時間,一般CLOCKS_PER_SEC的值為1000,可見計時精度可達小數點後3位(毫秒級)。
CLK_TCK CLOCKS_PER_SEC
計時的簡單示例如下
<ctime> #include <iostream> i = =( i-- ); end =, ()(end - start) /
這裡精確的含義是計時的精度更高,為了達到更高的計時精度,需要使用精確時間函數QueryPerformanceCounter()和QueryPerformanceFrequency(),它們需要計算機從硬件上支持精確定時器。當然,現在計算機一般都是支持的。
QueryPerformanceCounter()函數返回高精確度計數器的脈沖數目(計時數),QueryPerformanceFrequency()函數提供了高精度計時器的頻率值,即每秒脈沖數。
QueryPerformanceFrequency (LARGE_INTEGER * QueryPerformanceCounter (LARGE_INTEGER *lpCount);
其中,數據類型LARGE_INTEGER既可以是一個8字節長的整型數,也可以是兩個4字節長的整型數的聯合結構, 其具體用法根據編譯器是否支持64位而定。該類型的定義如下:
LONG HighPart;
在進行定時之前,先調用QueryPerformanceFrequency()函數獲得機器內部定時器的時鐘頻率,然後在需要嚴格定時的事件發生之前和發生之後分別調用QueryPerformanceCounter()函數,利用兩次獲得的計數之差及時鐘頻率,計算出事件經歷的精確時間。其過程與clock()方法類似,但這裡的時鐘頻率很高,測試電腦上頻率的QuadPart值為3118031,其精度原高於clocK()。
為了更好地使用這種計時方式,已將其封裝成HpTime類,。使用該類,計時程序如下
<iostream> i = ( i-- );