C/C++中的計(jì)時(shí)函數(shù)是clock()。
創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括萊西網(wǎng)站建設(shè)、萊西網(wǎng)站制作、萊西網(wǎng)頁制作以及萊西網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,萊西網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到萊西省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
所以,可以用clock函數(shù)來計(jì)算的運(yùn)行一個(gè)循環(huán)、程序或者處理其它事件到底花了多少時(shí)間,具體參考代碼如下:
#include?“stdio.h”
#include?“stdlib.h”
#include?“time.h”
int?main(?void?)
{
long????i?=?10000000L;
clock_t?start,?finish;
double??duration;
/*?測量一個(gè)事件持續(xù)的時(shí)間*/
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");
}
BOOL?QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);可以返回硬件支持的高精度計(jì)數(shù)器的頻率。先調(diào)用QueryPerformanceFrequency()函數(shù)獲得機(jī)器內(nèi)部計(jì)時(shí)器的時(shí)鐘頻率。接著在需要嚴(yán)格計(jì)時(shí)的事件發(fā)生前和發(fā)生之后分別調(diào)用QueryPerformanceCounter(),利用兩次獲得的計(jì)數(shù)之差和時(shí)鐘頻率,就可以計(jì)算出事件經(jīng)歷的精確時(shí)間。
#include?"stdafx.h"
#include?windows.h
#include?time.h
#include??"process.h"
#define?random(x)?(rand()%x)
int?_tmain(int?argc,?_TCHAR*?argv[])
{
LARGE_INTEGER?fre?=?{?0?};??//儲存本機(jī)CPU時(shí)鐘頻率
LARGE_INTEGER?startCount?=?{?0?};
LARGE_INTEGER?endCount?=?{?0?};
QueryPerformanceFrequency(fre);//獲取本機(jī)cpu頻率
//開始計(jì)時(shí)
QueryPerformanceCounter(startCount);
//運(yùn)算
for?(int?i?=?0;?i??10000000;?i++)
{
float?fTem1?=?random(100)*random(1000)*random(10000)*random(100000);
}
//結(jié)束計(jì)時(shí)
QueryPerformanceCounter(endCount);
//計(jì)算時(shí)間差
double?dTimeTake?=?((double)endCount.QuadPart?-?(double)startCount.QuadPart)?/?(double)fre.QuadPart;
printf("用時(shí)%f\n",?dTimeTake);
system("pause");
return?0;
}
CLOCK()函數(shù):
clock()是C/C++中的計(jì)時(shí)函數(shù),而與其相關(guān)的數(shù)據(jù)類型是clock_t。在MSDN中,查得對clock函數(shù)定義如下:
clock_t
clock(void)
;
這個(gè)函數(shù)返回從“開啟這個(gè)程序進(jìn)程”到“程序中調(diào)用clock()函數(shù)”時(shí)之間的CPU時(shí)鐘計(jì)時(shí)單元(clock
tick)數(shù),在MSDN中稱之為掛鐘時(shí)間(wal-clock);若掛鐘時(shí)間不可取,則返回-1。其中clock_t是用來保存時(shí)間的數(shù)據(jù)類型,在time.h文件中,我們可以找到對它的定義:
#ifndef
_CLOCK_T_DEFINED
typedef
long
clock_t;
#define
_CLOCK_T_DEFINED
#endif
很明顯,clock_t是一個(gè)長整形數(shù)。在time.h文件中,還定義了一個(gè)常量CLOCKS_PER_SEC,它用來表示一秒鐘會有多少個(gè)時(shí)鐘計(jì)時(shí)單元,其定義如下:
#define
CLOCKS_PER_SEC
((clock_t)1000)
可以看到每過千分之一秒(1毫秒),調(diào)用clock()函數(shù)返回的值就加1。下面舉個(gè)例子,你可以使用公式clock()/CLOCKS_PER_SEC來計(jì)算一個(gè)進(jìn)程自身的運(yùn)行時(shí)間:
void
elapsed_time()
{
printf("Elapsed
time:%u
secs.\n",clock()/CLOCKS_PER_SEC);
}
當(dāng)然,你也可以用clock函數(shù)來計(jì)算你的機(jī)器運(yùn)行一個(gè)循環(huán)或者處理其它事件到底花了多少時(shí)間:
#include
stdio.h
#include
stdlib.h
#include
time.h
int
main(void)
{
long
i
=
10000000L;
clock_t
start,
finish;
double
duration;
/*
測量一個(gè)事件持續(xù)的時(shí)間*/
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");
}
在筆者的機(jī)器上,運(yùn)行結(jié)果如下:
Time
to
do
10000000
empty
loops
is
0.03000
seconds
上面我們看到時(shí)鐘計(jì)時(shí)單元的長度為1毫秒,那么計(jì)時(shí)的精度也為1毫秒,那么我們可不可以通過改變CLOCKS_PER_SEC的定義,通過把它定義的大一些,從而使計(jì)時(shí)精度更高呢?通過嘗試,你會發(fā)現(xiàn)這樣是不行的。在標(biāo)準(zhǔn)C/C++中,最小的計(jì)時(shí)單位是一毫秒。
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ù)
要計(jì)算前后一段時(shí)間的話之前取一次time,之后取一次相減就知道用了多少秒了
獲取程序運(yùn)行時(shí)間:
在time.h里有函數(shù)clock();本身這個(gè)函數(shù)取得的時(shí)間好像是ms,要取得s就
寫成clock()/CLOCKS_PER_SEC;但CLOCKS_PER_SEC是在time.h里定義的,如果沒這個(gè)定義
那只能用clock();取得ms;這個(gè)函數(shù)的執(zhí)行不會中途停止,如果是在windows系統(tǒng)下,因?yàn)樗?/p>
多任務(wù)系統(tǒng),它需要在各任務(wù)之間切換,如果在測試過程中,執(zhí)行其他程序,所其得的時(shí)間,就會
出現(xiàn)差別,還有windows運(yùn)行速度相當(dāng)快,對于小型的測試,所得的時(shí)間幾乎為0,因此最好將
要測試的過程執(zhí)行100次或以上,然后再將取得的時(shí)間執(zhí)行次數(shù);輸出非常耗時(shí)間,沒什么必要
的話,就不要輸出
這是一個(gè)測試選擇排序的程序
#include
stdio.h
#include
stdlib.h
#include
time.h
#define
M
1000
/*
執(zhí)行次數(shù)
*/
#define
N
500
/*
數(shù)組大小
*/
void
SelectSort(int
*a,int
l,int
r)
{
int
i,j,v;
for
(i=0;ir;i++)
{
for
(j=i+1;j=r;j++)
{
if
(*(a+i)*(a+j))
v=*(a+i),*(a+i)=*(a+j),*(a+j)=v;
}
}
}
void
main()
{
int
a[N],i,j;
double
start,finish;
/*
開始時(shí)間,結(jié)束時(shí)間
*/
start=(double)clock();
/*
我的time.h內(nèi)沒有CLOCKS_PER_SEC
*/
for
(j=0;jM;j++)
{
/*
執(zhí)行M次
*/
for
(i=0;iN;*(a+i++)=rand()%10);
/*
每次重新賦值
*/
SelectSort(a,0,N-1);
}
finish=(double)clock();
printf("%.4fms",(finish-start)/M);
getchar();
}