测量程序运行时间
来源:互联网 发布:java 效率 编辑:程序博客网 时间:2024/04/29 01:07
一:基于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>
二:基于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 Switch和Instruction Cache的影响,所以高精度计时必须设法消除上述两种因素的影响,对Context Switch主要是采用在负载低的机器上多次计算求平均,而对Instruction Cache多采用提前载入需要测试代码段的Instruction,然后执行测量的方法.具体做法参见
http://www.cs.usfca.edu/~cruse/cs210/rdtscpm1-1.pdf
Computer System: A programmer's perspective(Chapter 7)
缺点:精度不够高,不能用于程序运行持续时间小于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>
二:基于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 Switch和Instruction Cache的影响,所以高精度计时必须设法消除上述两种因素的影响,对Context Switch主要是采用在负载低的机器上多次计算求平均,而对Instruction Cache多采用提前载入需要测试代码段的Instruction,然后执行测量的方法.具体做法参见
http://www.cs.usfca.edu/~cruse/cs210/rdtscpm1-1.pdf
Computer System: A programmer's perspective(Chapter 7)
- 测量程序运行时间
- 测量程序运行时间
- 测量程序运行时间
- 测量程序运行时间
- 程序运行时间的测量
- timeofday测量程序运行时间
- 程序运行时间的测量
- 测量程序的运行时间
- 精确测量程序运行时间
- 测量java程序运行时间
- C#测量程序运行时间
- opencv测量程序运行时间
- 程序运行时间的测量
- java 测量程序运行时间
- 程序运行时间的测量
- php中测量程序运行时间
- 如何精确测量程序运行时间
- 测量程序运行时间的几个函数
- CE5按键驱动开发笔记-2
- 存储过程与触发器Web调用代码
- Microsoft Visual C# Express Edition调试遇难到的问题 —— 来源于 百度知道
- 8254定时器 和 8259A中断控制器 知识点
- jEditable jQuery技术使用
- 测量程序运行时间
- 10个DB2问题我居然遇到了3个,晕..
- 带图片预览的图片上传代码
- 图像采集卡选择
- 多线程并发思考--文件加锁
- [C#][固定格式网页解析]使用正则表达式处理网页的初步体会
- C#提取HTML代码中的文字
- Java: 如何加密解密 How to encrypt and decrypt
- 凹凸笔试题目