VC实例分析:VC++通过汇编获取代码运行时间

原创 2007年10月06日 22:44:00
如何获得程序或者一段代码运行的时间?你可能说有专门的程序测试工具,确实,不过你也可以在程序中嵌入汇编代码来实现。

  在Pentium的指令系统中有一条指令可以获得CPU内部64位计数器的值,我们可以通过代码两次获取该计数器的值而获得程序或代码运行的时钟周期数,进而通过你的cpu的频率算出一个时钟周期的时间,从而算出程序运行的确切时间。

  我们通过指令TDSIC来获得cpu内部计数器的值,指令TDSIC返回值放在EDX:EAX中,其中EDX中存放64位寄存器中高32位的值,EAX存放第32位的值.

下面看看实现的代码:

//用汇编实现获取一段代码运行的时间
#include<iostream>

using namespace std;

void GetClockNumber (long high, long low);
void GetRunTime();

int main()
{   

long HighStart,LowStart,HighEnd,LowEnd;
long numhigh,numlow;
//获取代码运行开始时cpu内部计数器的值
__asm       
{
 RDTSC
 mov HighStart, edx
 mov LowStart, eax
}
for(int i= 0; i<100000; i++ )
{
       for(int i= 0; i<100000; i++ )
   {
   
   }

}
//获取代码结束时cpu内部计数器的值,并减去初值
    __asm
{
 RDTSC
 mov HighEnd, edx
 Mov LowEnd, eax
 ;获取两次计数器值得差
 sub eax, LowStart
 cmp  eax, 0    ; 如果低32的差为负则求返,因为第二次取得永远比第一次的大
 jg   L1
 neg   eax
 jmp   L2
      L1: mov numlow, eax
      L2: sbb edx, HighStart
 mov numhigh, edx
 
}
    //把两个计数器值之差放在一个64位的整形变量中
    //先把高32位左移32位放在64的整形变量中,然后再加上低32位
__int64 timer =(numhigh<<32) + numlow;
     //输出代码段运行的时钟周期数
     //以频率1.1Gcpu为例,如果换计算机把其中的1.1改乘其它即可,因为相信大家的cpu都应该在1G以上 ^_^
cout<< (double) (timer /1.1/1000000000) << endl;
return 0;
}


   这样通过一条简单的汇编指令就可以获得程序或一段代码的大概时间,不过并不能得到运行的确切时间,因为即使去掉中间的循环,程序也会有个运行时间,

因为在第一次取得计数器的值后,有两条汇编指令mov HighStart, edx    mov LowStart, eax这两条指令当然也有运行时间 ,当然你可以减去这两条指令的运行时间(在1.1G的机子上是3e-8s),这样会更精确一点。

  如果你要确切知道程序的运行时间,专业的测试软件肯定会更好一点,不过好像一般没有必要获取除非专门的要求的程序。

  不过能DIY一个也是不错的,不管有没有,最起码你可以学到在VC++中如何嵌入汇编代码以及如何使用32位的寄存器,其实和16位的寄存器一样使用,将来64的也应该一样,只不过位数不同罢了。 

 

C++ 解析GPS数据示例

C++ 解析GPS数据示例: GPS数据类型示例: $GPGGA,025620.00,2602.33721,N,11911.49176,E,2,04,1.63,13.5,M,9.9,M,,000...
  • qingzai_
  • qingzai_
  • 2016年04月22日 11:36
  • 2498

VC程序运行时间测试函数

VC程序运行时间测试函数 介绍        我们在衡量一个函数运行时间,或者判断一个算法的时间效率,或者在程序中我们需要一个定时器,定时执行一...
  • LG1259156776
  • LG1259156776
  • 2016年03月03日 10:33
  • 2210

VC++ 提高C++程序运行效率10个简单方法(其他语言程序参考)

程序性能的优化也是一门复杂的学问,需要很多的知识,然而并不是每个程序员都具备这样的知识,而且论述如何优化程序提高程序运行效率的书籍也很少。但是这并不等于我们可以忽略程序的运行效率...
  • Antares_SANTALEN
  • Antares_SANTALEN
  • 2016年09月14日 10:23
  • 1224

VC++如何获取代码运行时间

如何获取代码运行时间 在调试中,经常需要计算某一段代码的执行时间,下面给出两种常用的方式: 第一种:使用GetTickCount函数 #include #include ...
  • zjd1023
  • zjd1023
  • 2011年05月01日 00:19
  • 1834

VC++追踪代码运行时间

为了方便调试,自己编写了一个探测代码运行时间的类。 该类能够实现us级的精确延时,对于一般的算法应用(ms级别)足够了。 主要用到windows的API,以下是代码: DetectTim...
  • Kelvin_Yan
  • Kelvin_Yan
  • 2014年12月07日 15:54
  • 579

vc++实例超详细(代码,工程文件,程序分析,运行结果)

  • 2011年05月18日 13:18
  • 5.42MB
  • 下载

【VS开发】VC++ 获取系统时间、程序运行时间(精确到秒,毫秒)的五种方法

1.使用CTime类(获取系统当前时间,精确到秒) CString str; //获取系统时间 CTime tm; tm=CTime::GetCurrentTime();//获取系统日期 s...
  • LG1259156776
  • LG1259156776
  • 2016年05月03日 21:12
  • 4914

VC++ 之获取主机IP gethostbyname()函数 详细实例分析

以下是VC Socket初始化时用到的两个函数 一、WSAStartup函数                 int WSAStartup                        (     ...
  • lqhed
  • lqhed
  • 2016年05月27日 08:58
  • 357

StopWatch 监控Java代码运行时间和分析性能

我们在日常进行Java语言开发时,可能需要监控不同方法的运行时间,知道性能瓶颈在哪。利用springframework框架的工具类StopWatch可以快速方便的查看到每段代码运行的时间,准确确定性能...
  • hj289860219
  • hj289860219
  • 2017年07月17日 18:48
  • 155

如何获取代码运行时间

如何获取代码运行时间      在调试中,经常需要计算某一段代码的执行时间,下面给出两种常用的方式: 第一种:使用GetTickCount函数 #include #include ...
  • u014120684
  • u014120684
  • 2014年05月02日 10:41
  • 463
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VC实例分析:VC++通过汇编获取代码运行时间
举报原因:
原因补充:

(最多只允许输入30个字)