日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux测试函数耗时tick数,C语言中怎样测验函数执行时间

發(fā)布時(shí)間:2025/3/12 linux 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux测试函数耗时tick数,C语言中怎样测验函数执行时间 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

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

下面就來逐一介紹,并比較它們的優(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

#include

#include

#include

#include

#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)庫函數(shù),關(guān)于這個(gè)函數(shù)需要說明幾點(diǎn)。

首先,它返回的是CPU耗費(fèi)在本程序上的時(shí)間。也就是說,途中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過多的話,并不能完全真實(shí)反映被測(cè)量函數(shù)的運(yùn)行時(shí)間。

4. 使用getrusage的方法:

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

取消

評(píng)論

總結(jié)

以上是生活随笔為你收集整理的linux测试函数耗时tick数,C语言中怎样测验函数执行时间的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。