资源预览内容
第1页 / 共3页
第2页 / 共3页
第3页 / 共3页
亲,该文档总共3页全部预览完了,如果喜欢就下载吧!
资源描述
最近突然有必要测试 C 语言中各个函数的运行时间,于是就搜索了一下,发现有 4 种方法 可以达成测算程序运行时间的目的。 它们分别是使用 clock, times, gettimeofday, getrusage 来实现的。下面就来逐一介绍,并比较 它们的优劣点。 程序做的处理很简单,就是填写一个 1024*1024 的矩阵。 #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_MatrixCOORDINATION_XCOORDINATION_Y;double getTimeval() struct rusage stRusage;struct timeval stTimeval;if (TEST_METHOD = TEST_BY_GETTIMEOFDAY) gettimeofday( else if (TEST_METHOD = TEST_BY_GETRUSAGE) getrusage(RUSAGE_SELF, 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( 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_Matrixij = i * j; * if (TEST_METHOD = TEST_BY_CLOCK) clockT2 = clock();printf(“Time result tested by clock = %10.30fn“,(double)(clockT2 - clockT1)/CLOCKS_PER_SEC); else if (TEST_METHOD = TEST_BY_TIMES) times(printf(“Time result tested by times = %10.30fn“,(double)(clockT2 - clockT1)/sysconf(_SC_CLK_TCK); else if (TEST_METHOD = TEST_BY_GETTIMEOFDAY) doubleT2 = getTimeval();printf(“Time result tested by gettimeofday = %10.30fn“,(double)(doubleT2 - doubleT1); else if (TEST_METHOD = TEST_BY_GETRUSAGE) doubleT2 = getTimeval();printf(“Time result tested by getrusage = %10.70fn“,(double)(doubleT2 - doubleT1);return 0; 使用 clock 的方法: clock 是 ANSI C 的标准库函数,关于这个函数需要说明几点。 首先,它返回的是 CPU 耗费在本程序上的时间。也就是说,途中 sleep 的话,由于 CPU 资 源被释放,那段时间将不被计算在内。 其次,得到的返回值其实就是耗费在本程序上的 CPU 时间片的数量,也就是 Clock Tick 的 值。该值必须除以 CLOCKS_PER_SEC 这个宏值,才能最后得到 ss.mmnn 格式的运行时间。 在 POSIX 兼容系统中,CLOCKS_PER_SEC 的值为 1,000,000 的,也就是 1MHz。最后,使用这个函数能达到的精度大约为 10ms。使用 times 的方法: times 的用法基本和 clock 类似,同样是取得 CPU 时间片的数量,所不同的是要除以的时间 单位值为 sysconf(_SC_CLK_TCK)。 使用 gettimeofday 的方法: 用 gettimeofday 直接提取硬件时钟进行运算,得到的结果的精度相比前两种方法提高了很 多。 但是也正由于它提取硬件时钟的原因,这个方法只能计算程序开始时间和结束时间的差值。 而此时系统中如果在运行其他的后台程序,可能会影响到最终结果的值。如果后台繁忙, 系统 dispatch 过多的话,并不能完全真实反映被测量函数的运行时间。 使用 getrusage 的方法: getrusage 得到的是程序对系统资源的占用信息。只要指定了 RUSAGE_SELF,就可以得到 程序本身运行所占用的系统时间。 可以说是精度最高的测量方法了。 自己试用了这四种方法,感觉需要高精度测试的话,getrusage 和 gettimeofday 都可以选择。 需要长时间测试的话,clock 也是不错的,尤其是考虑到它的通用性。
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号