关于测试程序运行时间

要想准确测试程序运行时间,似乎是不可能完成的任务;
目前测量程序运行时间主要有两类方法,一种是基于计时器Timer的,另一种是基于计数器Counter的。

一:基于Timer的测量方法。
缺点:精度不够高,不能用于程序运行持续时间小于100ms的测量。
优点:准确性不是十分依赖于系统负载,并且在执行时间大于1s的程序上,与理论值之间的误差很低。
方法:在程序开始时读取计时器的内容,在程序终止前再次读取Timer的内容。主要的接口函数有:
Unix/Linux:
clock_t times(struct tms *buf);
//return value:系统自启动以来经过的时间滴答数,常数CLK_TCK表示每秒经过的时钟滴答数
//parameter:一个指向tms结构的指针
//使用该函数时要包含头文件
Win32:
DWORD GetTickCount(VOID)
//return value:the number of milliseconds that have elapsed since the system was started.
//使用时应包含,link阶段应链接 kernel32.lib
如果要编写可进行平台移植的代码,可以利用下面的函数:
clock_t clock(void)
//常数CLOCKS_PER_SEC保证将该函数返回的值格式化为秒数
//使用该函数时要包含头文件


//unix/linux win32
【转】关于测试程序运行时间#include <ctime>
#include
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++ 头文件为

// win32
【转】关于测试程序运行时间#include <windows.h> 
【转】关于测试程序运行时间#include
 <cstdlib> 
【转】关于测试程序运行时间#include
 <cstdio> 
【转】关于测试程序运行时间
//#include
【转】关于测试程序运行时间

【转】关于测试程序运行时间
 int beginTime=GetTickCount();
【转】关于测试程序运行时间
【转】关于测试程序运行时间
 int endTime=GetTickCount();
【转】关于测试程序运行时间 endTime
-=beginTime;
【转】关于测试程序运行时间 printf(
"\nRunning time: %d ms\n",endTime);
【转】关于测试程序运行时间
 //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指令,所以可以直接在程序中嵌入汇编代码,下面是一个简单示例:
// VC 6.0 中的ASM 代码
long HighStart,LowStart;
long numhigh,numlow;
//获取代码运行开始时cpu内部计数器的值
__asm
{
CPUID
RDTSC
mov HighStart, edx
mov LowStart, eax
}
//这里放你要测试的代码

//获取代码结束时cpu内部计数器的值,并减去初值
__asm
{
CPUID
RDTSC
sub eax, LowStart
mov numlow, eax
mov eax,edx
sbb eax,HighStart
mov numhigh,eax
}

参考文章:
测量程序运行时间的几种方法 http://blog.csdn.net/hailongchang/archive/2006/12/13/1441079.aspx
补充:测量程序运行时间的几种方法 http://blog.csdn.net/hailongchang/archive/2006/12/15/1444365.aspx
在VC++通过汇编实现获取代码运行时间 http://blog.csdn.net/hcj2002/archive/2004/06/13/17305.aspx
http://topic.csdn.net/t/20060409/12/4673536.html

你可能感兴趣的:(C/C++)