测量程序运行时间的方法

转自: http://www.cppblog.com/qey/articles/66772.html

精确测量某一个程序运行的确切时间是很困难的,所谓的测量运行时间只是做一个近似的测量。

目前测量程序运行时间主要有两类方法,一种是基于计时器Timer的,另一种是基于计数器Counter的。

一:基于Timer的测量方法。

缺点:精度不够高,不能用于程序运行持续时间小于100ms的测量。
优点:准确性不是十分依赖于系统负载,并且在执行时间大于1s的程序上,与理论值之间的误差很低。
方法:在程序开始时读取计时器的内容,在程序终止前再次读取Timer的内容。主要的接口函数有:

Unix/Linux:
clock_t times(struct tms *buf);
//return value:系统自启动以来经过的时间滴答数,常数CLK_TCK表示每秒经过的时钟滴答数

//parameter:一个指向tms结构的指针
//使用该函数时要包含头文件<sys/times.h>

Win32:
DWORD GetTickCount(VOID)
//return value:the number of milliseconds that have elapsed since the system was started.
//使用时应包含<windows.h>,link阶段应链接 kernel32.lib

 

如果要编写可进行平台移植的代码,可以利用下面的函数:
clock_t clock(void)
//常数CLOCKS_PER_SEC保证将该函数返回的值格式化为秒数
//使用该函数时要包含头文件<time.h>

 

//unix/linux win32 
#include <ctime> 
#include <iostream> 
using namespace std; 

time_t start = clock(); //程序开头 

//程序结束 
time_t end =clock(); 
double dur =static_cast<double>(end -start)/CLOCKS_PER_SEC*1000; 
cout<< "\nRunning Time: " <<dur << "milliseconds"<<endl; 
//关于clock 的返回值以及其他信息
//可以查MSDN 的time.h 对应c++ 头文件为<ctime> 。

 

// win32

#include <windows.h> 
#include <cstdlib> 
#include <cstdio> 
#include <iostream>   
 int beginTime=GetTickCount();     
int endTime=GetTickCount();    
 endTime-=beginTime;       
cout<< "nRunning time:"<< endTime << "ms"<< endl;



 

二:基于Counter的测量方法。
缺点:只能用汇编语言读取,不能保证通用性,在系统负载很大的情况下,将极大的影响准确性
优点:精度高,并且因为得到的是程序执行期间所经过的时钟周期数,所以可大致估算出在不同硬件平台上程序的执行时间。
方法:在IA32体系结构中,CPU内部有一个被称为“时间戳(TimeStamp)”的64位无符号数计数器,存储自cpu上电以来所经过的时钟周期数。
一:WIN32中有一个 QueryPerformanceCouter函数读取的就是一个64位的计数器.
二:目前的compiler有的不支持 RDTSC指令,如果在这种compiler下,可以利用__emit指令绕过compiler执行,应该在文件头加入:
#define CPUID __asm __emit 0fh __asm __emit 0a2h
#define RDTSC __asm __emit 0fh __asm __emit 031h

微软的C/C++编译器从6.0版开始支持CPUID和RDTSC指令,所以可以直接在程序中嵌入汇编代码,下面是一个简单示例:
#include<stdio.h>
int main()
{
unsigned int cycle,i;
__asm 
{
CPUID
RDTSC
mov cycle,eax
}
for(i=0;i<10000;i++)
;
__asm
{
CPUID
RDTSC
sub eax,cycle
mov cycle,eax
}
printf("the program duration cycle = %d/n",cycle);
return 0;
}

由于基于counter的测量方法受影响的因素较多,主要是 Context SwitchInstruction Cache的影响,所以高精度计时必须设法消除上述两种因素的影响
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值