问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何使用dp测量一个函数的执行时间

发布网友 发布时间:2022-05-31 20:06

我来回答

1个回答

热心网友 时间:2023-10-26 02:04

有4种方法可以达成测算程序运行时间的目的。

它们分别是使用clock, times, gettimeofday, getrusage来实现的。

下面就来逐一介绍,并比较它们的优劣点。 


系统测试环境:

VirtualBox (Ubuntu 9.10)

gcc version 4.4.1

libc6 2.10.1-0ubuntu16

Core Duo T2500 2GMHz


例程如下:

只要修改第11行的定义值,就可以使用不同的测量方法了。


#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;  

}


使用clock的方法:

clock是ANSI C的标准库函数,关于这个函数需要说明几点。


首先,它返回的是CPU耗费在本程序上的时间。也就是说,途中sleep的话,由于CPU资源被释放,那段时间将不被计算在内。


其次,得到的返回值其实就是耗费在本程序上的CPU时间片的数量,也就是Clock Tick的值。该值必须除以CLOCKS_PER_SEC这个宏值,才

能最后得到ss.mmnn格式的运行时间。在POSIX兼容系统中,CLOCKS_PER_SEC的值为1,000,000的,也就是

1MHz。


最后,使用这个函数能达到的精度大约为10ms。 


2. 使用times的方法:


times的用法基本和clock类似,同样是取得CPU时间片的数量,所不同的是要除以的时间单位值为sysconf(_SC_CLK_TCK)。


3. 使用gettimeofday的方法:


用gettimeofday直接提取硬件时钟进行运算,得到的结果的精度相比前两种方法提高了很多。


但是也正由于它提取硬件时钟的原因,这个方法只能计算程序开始时间和结束时间的差值。而此时系统中如果在运行其他的后台程序,可能会影响到最终结果的值。如果后台繁忙,系统dispatch过多的话,并不能完全真实反映被测量函数的运行时间。 


4. 使用getrusage的方法:


getrusage得到的是程序对系统资源的占用信息。只要指定了RUSAGE_SELF,就可以得到程序本身运行所占用的系统时间。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
高考560分能上211大学吗? - 知乎 河北高考多少分能上211大学 河北2023高考211分数线是多少? 考560分能上211大学吗河北 刀剑英雄合王者武器多少费用 刀剑英雄帝辰王者现在什么价位 2021年度工程施工合同范本 2021承包转让简单的合同范本 2021医院食堂承包合同范本 div+css+js实现菜单的收缩与展开 调用数据库内容的时候为什么内容字段... 我是* 梦见自己生俩大儿子 有一个是怪胎长着马的尾巴 恶心死了 闲鱼交易和平精英车钥匙要怎么交易最安全 家用新风机和空调区别在哪里? 班级的图书借阅公约怎么写? 杀怪做任务,SS天赋要怎么点? 炉石传说术士的大魔王卡怎么获得 炉石传说术士 烈焰小鬼卡怎么得 WLK术士职业任务 怎么解除绑定 微信解除绑定手机 券商持股的股票是不是最近比较好呀?(股指期货来临时候) 什么是券商持股? c语言编程基本例子,题主是小白,在照例子输入后程序运行错误,求解 被好友删除了,对方换并升及了,还能加上对方吗? 微信对方把我删了之后改掉,我这边还有对方微信可以在添加吗? 小孩鼻里毛细血管破裂,流鼻血多而猛,请问要怎么做才能止血?紧急求助 鼻子流血了怎么样可以快速止血 注册海外公司在什么国家好? 注册国外公司怎么选择? 我想注册个海外公司,请问注册海外公司注册哪里地方比较好呢?保密性比较好的,而且可以少交税的地方? PPP到底是什么广西来宾股票期货开户 2016年兰州医保交多少线 2016年甘肃省社保缴费基数调整最新,甘肃省社保缴费基数怎么算 现在兰州的社保需要购买几项,企业和个人承担的比例是多少,购买基数多少,谢谢! 外卖管家GPRS每个月需要流量是多少 外卖管家GPRS每个月需要多少流量 如何用实验证明空气的存在 家里用什么道具可以找到空气 怎么做捕捉空气的实验 要步骤 用塑料袋怎样来寻找空气 化学问题? 车子封存可不可以搞个塑料袋包住然后抽干空气 塑料袋当中有粉尘和空气怎么样才能把空气抽走? 能抽塑料袋内空气的工具叫什么 有什么东西可以抽走塑料袋里的空气??? 怎么能让眼睛有效的休息 南极地区以陆地为主北极地区以海洋为主 班干部竞选演讲稿450字以上,是劳动委员,不要旧的。 竞争劳动委员的演讲稿,中专,男生,演讲稿里有责任感。 劳动委员就职演讲