c语言统计运行时间,c语言统计函数运行时间
目前还没有一种方法可以精确的测量一个程序的运行时间,但是有两种方法可以估算:一种是基于定时器的,另一种是基于计数器的。
1)基于定时器的测量方法
缺点:精度不够,不能用于程序运行时长小于100ms的测量。
优点:精度对系统负载依赖不是很大,执行时间大于1s时程序与理论值误差很低。
方法:在程序开始时读取定时器的内容,在程序终止前再次读取定时器的内容。
界面功能:
(1)Unix/Linux
clock _ t times(struct TMS * buf);
//返回值:系统启动后经过的时间的滴答数,常量CLK_TCK表示每秒钟时钟的滴答数。
//参数:指向tms结构的指针
//使用此函数时包含头文件
(2)Win32
DWORD GetTickCount(VOID)
//返回值:系统启动后经过的毫秒数。
//使用时,应该包括
//链接阶段应该链接kernel32.lib
(3)平台可移植代码
clock_t时钟(无效)
//常量CLOCKS_PER_SEC保证此函数返回值的格式为秒。
//使用此函数时包含头文件
/////////////////////C
#包括
使用命名空间std
///////////////////////////////////////////
clock_t开始,结束;
双倍时长;
start=时钟();
//在此键入您测试过的代码
finish=clock();
duration=(double)(finish-start)/CLOCKS _ PER _ SEC;
printf("%f秒\n ",持续时间);
系统(“暂停”);//经典的程序挂起方法
2)基于计数器的测量方法
缺点:只能用汇编语言读取,不能保证通用性。在系统负载较重的情况下,会大大影响精度。
优点:准确性高,并且由于获得了程序执行时的时钟周期数,可以大致估算出程序在不同硬件平台上的执行时间。
方法:在IA32架构中,cpu内部有一个名为“时间戳”的64位无符号数计数器,用来存储CPU上电以来的时钟周期数。
(1)WIN32
QueryPerformanceCouter函数读取64位计数器。
(2)当前的一些编译器不支持RDTSC指令。如果在这个编译器下,你可以使用__emit指令来绕过编译器的执行,并且你应该加上:
# define CPUID _ _ ASM _ _ emit 0fh _ _ ASM _ _ emit 0a2h
#定义RDTSC _ _ ASM _ _ emit 0fh _ _ ASM _ _ emit 031h
微软的C/C编译器从6.0版本开始就支持CPUID和RDTSC指令,因此可以将汇编代码直接嵌入到程序中。这里有一个简单的例子:
#包括
int main()
{
无符号整数循环,I;
__asm
{
CPUID
读取时间标记计数器
mov周期,eax
}
for(I=0;我10000;我)
;
__asm
{
CPUID
读取时间标记计数器
子eax,循环
mov周期,eax
}
printf(程序持续周期=%d\n ,cycle);
返回0;
}
由于基于计数器的测量方法受多种因素影响,主要是上下文切换和指令缓存的影响,高精度计时必须尽量消除上述两种因素的影响。对于上下文切换,主要是在一个低负载的机器上进行多次计算和平均,而对于指令缓存,则多是预先加载待测代码段的指令,然后进行度量。
详见《计算机系统:程序员的视角》(第7章)。
示例:
1 #包含“time.h”
2
3//时间变量和时间函数
4c lock _ t t start=0;
五
六
7void设置时间()
8 {
9t start=clock();
10}
11
12
13double Gettime()
14 {
15 return(double)((double)clock()(double)t start)/(double)CLOCKS _ PER _ SEC;
16}
17
18
19
20int main()
21{
22 Settime();//开始计时
23 /**//****
24做点什么****/
25
2 cout -监控需要时间:";
27 cout Gettime()endl;
28
29返回1;
30}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。