CLOCK()函數(shù):
為慶元等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及慶元網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都網(wǎng)站制作、網(wǎng)站設(shè)計、慶元網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
clock()是C/C++中的計時函數(shù),而與其相關(guān)的數(shù)據(jù)類型是clock_t。在MSDN中,查得對clock函數(shù)定義如下:
clock_t
clock(void)
;
這個函數(shù)返回從“開啟這個程序進程”到“程序中調(diào)用clock()函數(shù)”時之間的CPU時鐘計時單元(clock
tick)數(shù),在MSDN中稱之為掛鐘時間(wal-clock);若掛鐘時間不可取,則返回-1。其中clock_t是用來保存時間的數(shù)據(jù)類型,在time.h文件中,我們可以找到對它的定義:
#ifndef
_CLOCK_T_DEFINED
typedef
long
clock_t;
#define
_CLOCK_T_DEFINED
#endif
很明顯,clock_t是一個長整形數(shù)。在time.h文件中,還定義了一個常量CLOCKS_PER_SEC,它用來表示一秒鐘會有多少個時鐘計時單元,其定義如下:
#define
CLOCKS_PER_SEC
((clock_t)1000)
可以看到每過千分之一秒(1毫秒),調(diào)用clock()函數(shù)返回的值就加1。下面舉個例子,你可以使用公式clock()/CLOCKS_PER_SEC來計算一個進程自身的運行時間:
void
elapsed_time()
{
printf("Elapsed
time:%u
secs.\n",clock()/CLOCKS_PER_SEC);
}
當然,你也可以用clock函數(shù)來計算你的機器運行一個循環(huán)或者處理其它事件到底花了多少時間:
#include
stdio.h
#include
stdlib.h
#include
time.h
int
main(void)
{
long
i
=
10000000L;
clock_t
start,
finish;
double
duration;
/*
測量一個事件持續(xù)的時間*/
printf(
"Time
to
do
%ld
empty
loops
is
",
i)
;
start
=
clock();
while(
i--
);
finish
=
clock();
duration
=
(double)(finish
-
start)
/
CLOCKS_PER_SEC;
printf(
"%f
seconds\n",
duration
);
system("pause");
}
在筆者的機器上,運行結(jié)果如下:
Time
to
do
10000000
empty
loops
is
0.03000
seconds
上面我們看到時鐘計時單元的長度為1毫秒,那么計時的精度也為1毫秒,那么我們可不可以通過改變CLOCKS_PER_SEC的定義,通過把它定義的大一些,從而使計時精度更高呢?通過嘗試,你會發(fā)現(xiàn)這樣是不行的。在標準C/C++中,最小的計時單位是一毫秒。
time_t
time(
time_t
*timer
);
返回值是1970年到現(xiàn)在的秒數(shù)
用long型接就可以了
參數(shù)也是同樣意義
如
long
time_s
=
0;
time_s
=
time(
NULL
);
//
time_s就是1970年到現(xiàn)在的秒數(shù)
或者
long
*
time_s
=
NULL;
time(time_s);
//
*time_s就是1970年到現(xiàn)在的秒數(shù)
要計算前后一段時間的話之前取一次time,之后取一次相減就知道用了多少秒了
C語言中提供了許多庫函數(shù)來實現(xiàn)計時功能
下面介紹一些常用的計時函數(shù)
1. time()
頭文件:time.h
函數(shù)原型:time_t time(time_t * timer)
功能:返回以格林尼治時間(GMT)為標準,從1970年1月1日00:00:00到現(xiàn)在的時此刻所經(jīng)過的秒數(shù)
用time()函數(shù)結(jié)合其他函數(shù)(如:localtime、gmtime、asctime、ctime)可以獲得當前系統(tǒng)時間或是標準時間。
用difftime函數(shù)可以計算兩個time_t類型的時間的差值,可以用于計時。用difftime(t2,t1)要比t2-t1更準確,因為C標準中并沒有規(guī)定time_t的單位一定是秒,而difftime會根據(jù)機器進行轉(zhuǎn)換,更可靠。
說明:C標準庫中的函數(shù),可移植性最好,性能也很穩(wěn)定,但精度太低,只能精確到秒,對于一般的事件計時還算夠用,而對運算時間的計時就明顯不夠用了。
2. clock()
頭文件:time.h
函數(shù)原型:clock_t clock(void);
功能:該函數(shù)返回值是硬件滴答數(shù),要換算成秒,需要除以CLK_TCK或者 CLK_TCKCLOCKS_PER_SEC。比如,在VC++6.0下,這兩個量的值都是1000。
說明:可以精確到毫秒,適合一般場合的使用。
3. timeGetTime()
頭文件:Mmsystem.h??引用庫: Winmm.lib
函數(shù)原型:DWORD timeGetTime(VOID);
功能:返回系統(tǒng)時間,以毫秒為單位。系統(tǒng)時間是從系統(tǒng)啟動到調(diào)用函數(shù)時所經(jīng)過的毫秒數(shù)。注意,這個值是32位的,會在0到2^32之間循環(huán),約49.71天。
說明:該函數(shù)的時間精度是五毫秒或更大一些,這取決于機器的性能??捎胻imeBeginPeriod和timeEndPeriod函數(shù)提高timeGetTime函數(shù)的精度。如果使用了,連續(xù)調(diào)用timeGetTime函數(shù),一系列返回值的差異由timeBeginPeriod和timeEndPeriod決定。
4. GetTickCount()
頭文件:windows.h
函數(shù)原型:DWORD WINAPI GetTickCount(void);
功能:返回自設(shè)備啟動后的毫秒數(shù)(不含系統(tǒng)暫停時間)。
說明:精確到毫秒。對于一般的實時控制,使用GetTickCount()函數(shù)就可以滿足精度要求。
5. QueryPerformanceCounter()、QueryPerformanceFrequency()
頭文件:windows.h
函數(shù)原型:BOOLQueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount);
BOOLQueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
功能:前者獲得的是CPU從開機以來執(zhí)行的時鐘周期數(shù)。后者用于獲得你的機器一秒鐘執(zhí)行多少次,就是你的時鐘周期。
補充:LARGE_INTEGER既可以是一個8字節(jié)長的整型數(shù),也可以是兩個4字節(jié)長的整型數(shù)的聯(lián)合結(jié)構(gòu), 其具體用法根據(jù)編譯器是否支持64位而定:
在進行定時之前,先調(diào)用QueryPerformanceFrequency()函數(shù)獲得機器內(nèi)部定時器的時鐘頻率,然后在需要嚴格定時的事件發(fā)生之前和發(fā)生之后分別調(diào)用QueryPerformanceCounter()函數(shù),利用兩次獲得的計數(shù)之差及時鐘頻率,計算出事件經(jīng)歷的精確時間。
說明:這種方法的定時誤差不超過1微秒,精度與CPU等機器配置有關(guān),一般認為精度為透微秒級。在Windows平臺下進行高精度計時的時候可以考慮這種方法。
6. gettimeofday()
Linux C函數(shù)。
頭文件:sys/time.h
函數(shù)原型:int gettimeofday(struct timeval *tv,struct timezone *tz);
說明:其參數(shù)tv是保存獲取時間結(jié)果的結(jié)構(gòu)體,參數(shù)tz用于保存時區(qū)結(jié)果(若不使用則傳入NULL即可)。
timeval的定義為:
struct?timeval?{ ?
long?tv_sec;?//?秒數(shù)
long?tv_usec;?//微秒數(shù)
}
可見該函數(shù)可用于在linux中獲得微秒精度的時間。
說明:使用這種方式計時,精度可達微秒。經(jīng)驗證,在arm+linux的環(huán)境下此函數(shù)仍可使用。
在開始時用time()函數(shù)取一次時間,在結(jié)束時(輸入與生成相同時)再用time()取一次時間,之后求出再次時間之差即可。
*************************************************
#include
//for
printf()
#include
//for
system()
#include
//for
time()
time_t
void
main()
{
time_t
ts,te;
system("pause");
ts=time(null);
system("pause");
te=time(null);
printf("%ld\n",te-ts);
system("pause");
}
/////////////////////////////////////////////
輸出兩次按鍵之間的時間(秒)