C語(yǔ)言測(cè)試待測(cè)函數(shù)的耗時(shí) 如何測(cè)試c語(yǔ)言代碼

C語(yǔ)言中怎樣測(cè)試函數(shù)執(zhí)行時(shí)間

有4種方法可以達(dá)成測(cè)算程序運(yùn)行時(shí)間的目的。

成都創(chuàng)新互聯(lián)主要從事成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)臨淄,10年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):028-86922220

它們分別是使用clock, times, gettimeofday, getrusage來(lái)實(shí)現(xiàn)的。

下面就來(lái)逐一介紹,并比較它們的優(yōu)劣點(diǎn)。

系統(tǒng)測(cè)試環(huán)境:

VirtualBox (Ubuntu 9.10)

gcc version 4.4.1

libc6 2.10.1-0ubuntu16

Core Duo T2500 2GMHz

例程如下:

只要修改第11行的定義值,就可以使用不同的測(cè)量方法了。

#include sys/time.h

#include sys/resource.h

#include unistd.h

#include stdio.h

#include time.h

#define TEST_BY_CLOCK (char)(0x00)

#define TEST_BY_TIMES (char)(0x01)

#define TEST_BY_GETTIMEOFDAY (char)(0x02)

#define TEST_BY_GETRUSAGE (char)(0x03)

#define TEST_METHOD (TEST_BY_GETTIMEOFDAY)

#define COORDINATION_X (int)(1024)

#define COORDINATION_Y (int)(1024)

static int g_Matrix[COORDINATION_X][COORDINATION_Y];

double getTimeval()

{

struct rusage stRusage;

struct timeval stTimeval;

if (TEST_METHOD == TEST_BY_GETTIMEOFDAY)

{

gettimeofday(stTimeval, NULL);

}

else if (TEST_METHOD == TEST_BY_GETRUSAGE)

{

getrusage(RUSAGE_SELF, stRusage);

stTimeval = stRusage.ru_utime;

}

return stTimeval.tv_sec + (double)stTimeval.tv_usec*1E-6;

}

int main()

{

int i, j;

int n = 0;

clock_t clockT1, clockT2;

double doubleT1, doubleT2;

if (TEST_METHOD == TEST_BY_CLOCK)

{

clockT1 = clock();

}

else if (TEST_METHOD == TEST_BY_TIMES)

{

times(clockT1);

}

else if (TEST_METHOD == TEST_BY_GETTIMEOFDAY)

{

doubleT1 = getTimeval();

}

else if (TEST_METHOD == TEST_BY_GETRUSAGE)

{

doubleT1 = getTimeval();

}

for (i = 0; i COORDINATION_X; i++)

{

for (j = 0; j COORDINATION_Y; j++)

{

g_Matrix[i][j] = i * j;

}

}

if (TEST_METHOD == TEST_BY_CLOCK)

{

clockT2 = clock();

printf("Time result tested by clock = %10.30f\n",(double)(clockT2 - clockT1)/CLOCKS_PER_SEC);

}

else if (TEST_METHOD == TEST_BY_TIMES)

{

times(clockT2);

printf("Time result tested by times = %10.30f\n", (double)(clockT2 - clockT1)/sysconf(_SC_CLK_TCK));

}

else if (TEST_METHOD == TEST_BY_GETTIMEOFDAY)

{

doubleT2 = getTimeval();

printf("Time result tested by gettimeofday = %10.30f\n",(double)(doubleT2 - doubleT1));

}

else if (TEST_METHOD == TEST_BY_GETRUSAGE)

{

doubleT2 = getTimeval();

printf("Time result tested by getrusage = %10.70f\n", (double)(doubleT2 - doubleT1));

}

return 0;

}

1. 使用clock的方法:

clock是ANSI C的標(biāo)準(zhǔn)庫(kù)函數(shù),關(guān)于這個(gè)函數(shù)需要說(shuō)明幾點(diǎn)。

首先,它返回的是CPU耗費(fèi)在本程序上的時(shí)間。也就是說(shuō),途中sleep的話,由于CPU資源被釋放,那段時(shí)間將不被計(jì)算在內(nèi)。

其次,得到的返回值其實(shí)就是耗費(fèi)在本程序上的CPU時(shí)間片的數(shù)量,也就是Clock Tick的值。該值必須除以CLOCKS_PER_SEC這個(gè)宏值,才

能最后得到ss.mmnn格式的運(yùn)行時(shí)間。在POSIX兼容系統(tǒng)中,CLOCKS_PER_SEC的值為1,000,000的,也就是

1MHz。

最后,使用這個(gè)函數(shù)能達(dá)到的精度大約為10ms。

2. 使用times的方法:

times的用法基本和clock類似,同樣是取得CPU時(shí)間片的數(shù)量,所不同的是要除以的時(shí)間單位值為sysconf(_SC_CLK_TCK)。

3. 使用gettimeofday的方法:

用gettimeofday直接提取硬件時(shí)鐘進(jìn)行運(yùn)算,得到的結(jié)果的精度相比前兩種方法提高了很多。

但是也正由于它提取硬件時(shí)鐘的原因,這個(gè)方法只能計(jì)算程序開始時(shí)間和結(jié)束時(shí)間的差值。而此時(shí)系統(tǒng)中如果在運(yùn)行其他的后臺(tái)程序,可能會(huì)影響到最終結(jié)果的值。如果后臺(tái)繁忙,系統(tǒng)dispatch過(guò)多的話,并不能完全真實(shí)反映被測(cè)量函數(shù)的運(yùn)行時(shí)間。

4. 使用getrusage的方法:

getrusage得到的是程序?qū)ο到y(tǒng)資源的占用信息。只要指定了RUSAGE_SELF,就可以得到程序本身運(yùn)行所占用的系統(tǒng)時(shí)間。

c語(yǔ)言怎么測(cè)試一段程序的運(yùn)行時(shí)間?

C/C++中的計(jì)時(shí)函數(shù)是clock(),而與其相關(guān)的數(shù)據(jù)類型是clock_t。在MSDN中,查得對(duì)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)。其中clock_t是用來(lái)保存時(shí)間的數(shù)據(jù)類型,在time.h文件中,我們可以找到對(duì)它的定義:

#ifndef _CLOCK_T_DEFINED?

typedef long clock_t;?

#define _CLOCK_T_DEFINED?

#endif

很明顯,clock_t是一個(gè)長(zhǎng)整形數(shù)。在time.h文件中,還定義了一個(gè)常量CLOCKS_PER_SEC,它用來(lái)表示一秒鐘會(huì)有多少個(gè)時(shí)鐘計(jì)時(shí)單元,其定義如下:

#define CLOCKS_PER_SEC ((clock_t)1000)?? //CLOCKS_PER_SEC為系統(tǒng)自定義的

可以看到每過(guò)千分之一秒(1毫秒),調(diào)用clock()函數(shù)返回的值就加1。下面舉個(gè)例子,你可以使用公式clock()/CLOCKS_PER_SEC來(lái)計(jì)算一個(gè)進(jìn)程自身的運(yùn)行時(shí)間:

void elapsed_time()?

{?

printf("Elapsed time:%u secs./n",clock()/CLOCKS_PER_SEC);?

}

當(dāng)然,你也可以用clock函數(shù)來(lái)計(jì)算你的機(jī)器運(yùn)行一個(gè)循環(huán)或者處理其它事件到底花了多少時(shí)間:

#include “stdio.h”?

#include “stdlib.h”?

#include “time.h”

int main( )?

{

long i = 10000000L;

clock_t start, finish;

double Total_time;

/* 測(cè)量一個(gè)事件持續(xù)的時(shí)間*/

printf( "Time to do %ld empty loops is ", i );

start = clock();

while( i--) ;

finish = clock();

Total_time = (double)(finish-start) / CLOCKS_PER_SEC;

printf( "%f seconds/n", Total_time);

return 0;

}

在筆者的機(jī)器上,運(yùn)行結(jié)果如下:

Time to do 10000000 empty loops is 0.03000 seconds

上面我們看到時(shí)鐘計(jì)時(shí)單元的長(zhǎng)度為1毫秒,那么計(jì)時(shí)的精度也為1毫秒,那么我們可不可以通過(guò)改變CLOCKS_PER_SEC的定義,通過(guò)把它定義的大一些,從而使計(jì)時(shí)精度更高呢?通過(guò)嘗試,你會(huì)發(fā)現(xiàn)這樣是不行的。在標(biāo)準(zhǔn)C/C++中,最小的計(jì)時(shí)單位是一毫秒。

參考資料

c語(yǔ)言測(cè)試程序執(zhí)行時(shí)間.csdn博客[引用時(shí)間2017-12-31]

怎么用C語(yǔ)言來(lái)計(jì)算一個(gè)函數(shù)調(diào)用了多久

可以通過(guò)計(jì)算時(shí)間差的方法來(lái)計(jì)算一個(gè)函數(shù)調(diào)用了多久。

具體細(xì)節(jié)如下:

計(jì)算函數(shù)執(zhí)行時(shí)間是評(píng)價(jià)程序效率的一種常用方法。

可以在調(diào)用一個(gè)函數(shù)之間獲取當(dāng)前時(shí)間,在調(diào)用之后再次獲取當(dāng)前時(shí)間,然后計(jì)算二者的時(shí)間差。

但是如果一個(gè)函數(shù)執(zhí)行時(shí)間非常短,會(huì)得到兩個(gè)時(shí)間差為0的情況,此時(shí)可以修改程序?yàn)檎{(diào)用該函數(shù)1000次,然后把時(shí)間差除以1000。

得到當(dāng)前時(shí)間的方法是:首先程序最前面添加頭文件#includetime.h,然后通過(guò)調(diào)用time(NULL)獲取當(dāng)前時(shí)間。

新聞標(biāo)題:C語(yǔ)言測(cè)試待測(cè)函數(shù)的耗時(shí) 如何測(cè)試c語(yǔ)言代碼
網(wǎng)站URL:http://bm7419.com/article4/ddejhoe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作自適應(yīng)網(wǎng)站、用戶體驗(yàn)Google、虛擬主機(jī)、軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)