c++计算函数运行时间,c语言高精度运算

  c++计算函数运行时间,c语言高精度运算

  //C程序运行时间的高精度计算

  #包括iostream

  #包含windows.h

  使用命名空间std

  Void Test()//测试程序

  {

  for(int I=0;i 1000我)

  {

  for(int j=0;j j)

  {

  printf(%d,%d\n ,I,j);

  }

  }

  }

  int main(void)

  {

  LARGE _ INTEGER BegainTime

  LARGE_INTEGER结束时间;

  LARGE_INTEGER频率;

  QueryPerformanceFrequency(频率);

  QueryPerformanceCounter(begin time);

  //将待测试的代码放在这里

  test();

  QueryPerformanceCounter(end time);

  //输出运行时间(单位:秒)

  Cout 运行时间(单位:s):(double)(end time . quad part-begin time . quad part)/frequency . quad part endl;

  系统(“暂停”);

  返回0;

  }

  线框中的代码可以实现微秒级的时差计算精度:

  -

  LARGE _ INTEGER litmp

  LONGLONG QPart1,Qpart2

  double dfMinus,dfFreq,dfTime

  //获取定时器的时钟频率

  QueryPerformanceFrequency(litmp);

  dfFreq=(double)litmp。QuadPart

  QueryPerformanceCounter(litmp);

  Qpart1=litmp。QuadPart//开始计时

  block 1();//工作模块功能等。根据自己的需求添加。

  QueryPerformanceCounter(litmp);

  Qpart2=litmp。QuadPart//终止计时

  df MINUS=(double)(q part 2-q part 1);//计算计数器值

  df time=df MINUS/dff req;//以秒为单位获取相应的时间。您可以将1,000,000乘以毫秒级别(美国)

  -

  在一些计算机硬件系统中,有高分辨率的性能计数器

  计数器),可以用来获得高精度的定时间隔,其精度与CPU的时钟频率有关。

  1.首先调用QueryPerformanceFrequency函数,获取高精度运行计数器的频率f。是每秒的次数(n/s)。这个号码

  一般都很大。

  2.在需要计时的代码两端调用QueryPerformanceCounter,获取高精度运行计数器的值n1,n2。两次

  值差用f换算成时间间隔,t=(n2-n1)/f。

  这里有一个例子来说明这种方法的使用及其准确性。

  在VC 6.0下,用MFC构建一个对话框项目,命名为HightTimer。对话框面板中控件的布局如下:

  它包含两个静态文本框、两个编辑框和两个按钮。上下位置的编辑框id分别为IDC_E_TEST和IDC_E_ACT。

  UAL,MFC ClassWizard添加的成员变量也分别对应DWORD m_dwTest和DWORD m_dwAct。

  “退出”按钮的ID为IDOK,“开始测试”按钮的ID为IDC_B_TEST。使用MFC。

  ClassWizard添加该按钮的点击消息处理功能如下:

  void CHightTimerDlg:ontest()

  {

  //TODO:在此添加控件通知处理程序代码

  update data(TRUE);//将输入的测试时间值放入与编辑框关联的成员变量m_dwTest中

  大整数频率;//LARGE_INTEGER是并集,其中LOWPART是低32位,HIGHPART是高32位,

  //两者构成一个结构,QuadPart是其中的一个64位有符号整数,类型为LongLong。

  如果(!QueryPerformanceFrequency(frequency))//取高精度运行计数器的频率,如果硬件不支持则返回FALSE。

  MessageBox(您的计算机硬件不支持高分辨率性能计数器,

  不支持,MB _ icon感叹号 MB _ OK);

  LARGE_INTEGER测试,ret

  测试。四部分=频率。quad part * m _ dw test/1000000;

  //以变频微秒数(与CPU时钟有关)计数到相应的数,1秒=1000000微秒

  //test存储m_dwTest毫秒所需的次数。

  ret=MySleep(测试);//调用此函数启动延时,返回实际开销。

  m_dwAct=(DWORD)(1000000 * ret。四部分/频率。quad part);//转换为微秒

  update data(FALSE);//显示到对话框面板

  }

  上面调用的MySleep函数如下:

  LARGE _ INTEGER CHightTimerDlg:my sleep(LARGE _ INTEGER Interval)

  ///////////////////////////////////////////////////////////////////////////////////////////////////

  //////////

  //函数:执行实际延迟函数。

  //参数:间隔参数为需要执行的延时与时间有关的数量

  //返回值:返回此函数执行后实际所用的时间有关的数量

  ///////////////////////////////////////////////////////////////////////////////////////////////////

  ////////

  {

  大整数隐私、当前、过去

  QueryPerformanceCounter(prisious);

  当前=隐私;

  而(当前。四部分-隐私。四部分间隔。四部分)

  QueryPerformanceCounter(t);

  逝去QuadPart=当前。四部分-隐私四部分

  回归逝去;

  }

  注:别忘了在头文件中为此函数添加函数声明。

  至此,可以编译和执行此工程了,当测试时间超过3微秒时,准确度已经非常高了,此时机器执行本身延时函数代码的时间对需要延时的时间影响很小了。

  上面的函数由于演示测试的需要,没有在函数级封装,下面给出的函数基本上可以以全局函数的形式照搬到别的

  程序中。

  布尔我的睡眠(双字间隔)

  ///////////////////////////////////////////////////////////////////////////////////////////////////

  //////////

  //功能:执行微秒级的延时功能

  //参数:间隔参数为需要的延时数(单位:微秒)

  //返回值:若计算机硬件不支持此功能,返回假的,若函数执行成功,返回真实的

  ///////////////////////////////////////////////////////////////////////////////////////////////////

  ////////

  {

  BOOL bNormal=TRUE

  大整数频率、优先级、电流、间隔;

  如果(!QueryPerformanceFrequency(频率))

  {

  MessageBox(空,您的计算机硬件不支持高分辨率性能

  计数器,

  不支持,MB _ icon感叹号 MB _ OK);//或其它的提示信息

  返回错误的

  }

  间隔。四部分=频率quad部分* dw区间/1000000;

  b normal=b normal QueryPerformanceCounter(prisious);

  当前=隐私;

  而(当前。四部分-隐私。四部分间隔。四部分)

  b normal=b normal QueryPerformanceCounter(t);

  返回正常

  }

  需要指出的是,由于在此函数中的代码很多,机器在执行这些代码所花费的时间也很长,所以在需要几个微秒的

  延时时,会影响精度。实际上,读者在熟悉这种方法后,只要使用精确计时和查询员

  ceCounter这两个函数就能按实际需要写出自己的延时代码了。

  给你个类吧,我在用呢

  //已过时间。h:枯萎了类的接口。

  //

  //////////////////////////////////////////////////////////////////////

  #如果!已定义(AFX _ ELAPSED _ H _ _ 4a 992 e 21 _ 8b 47 _ 11d 6 _ B1 B2 _ fffce 130 b 010 _ _包括_)

  # define AFX _ ELAPSED _ H _ _ 4a 992 e 21 _ 8b 47 _ 11d 6 _ B1 B2 _ fffce 130 b 010 _ _ INCLUDED _

  # VER国际机场1000

  #杂注一次

  #endif //_MSC_VER 1000

  类枯萎了

  {

  私人:

  (同Internationalorganizations)国际组织已初始化;

  __int64频率;

  _ _ int64 BeginTime

  公共:

  布尔可用().

  双端();

  BOOL Begin();

  CElapsed();

  virtual ~ CElapsed();

  };

  #endif //!已定义(AFX _ ELAPSED _ H _ _ 4a 992 e 21 _ 8b 47 _ 11d 6 _ B1 B2 _ fffce 130 b 010 _ _包括_)

  //已过时间。CPP:已枯萎类的实现。

  //

  //////////////////////////////////////////////////////////////////////

  #include stdafx.h

  //#包含myimage.h

  #include Elapsed.h

  #ifdef _DEBUG

  #undef THIS_FILE

  static char THIS _ FILE[]=_ _ FILE _ _;

  #定义新的调试_新

  #endif

  //////////////////////////////////////////////////////////////////////

  //建设/破坏

  //////////////////////////////////////////////////////////////////////

  塞拉得:塞拉得()

  {

  initialized=QueryPerformanceFrequency((LARGE _ INTEGER *)Frequency);

  }

  cela速度:~ cela速度()

  {

  }

  BOOL cela速度:Begin()

  {

  如果(!已初始化)

  返回0;

  返回QueryPerformanceCounter((LARGE _ INTEGER *)开始时间);

  }

  双绉*结束()

  {

  如果(!已初始化)

  返回0;

  _ _ int64结束时间

  QueryPerformanceCounter((LARGE _ INTEGER *)结束时间);

  _ _ int 64 elapsed=结束时间-开始时间;

  返回(双精度)已用/(双精度)频率;

  }

  BOOL cela speed:available()

  {

  返回已初始化;

  }

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • 详解c语言中的字符串数组是什么,详解c语言中的字符串数组结构,详解C语言中的字符串数组
  • 表达式求值c++实现,c语言实现表达式求值
  • 看懂c语言基本语法,C语言详解,C语言的基本语法详解
  • 用c语言实现快速排序算法,排序算法设计与实现快速排序C语言,C语言实现快速排序算法实例
  • 深入解析c语言中函数指针的定义与使用方法,深入解析c语言中函数指针的定义与使用情况,深入解析C语言中函数指针的定义与使用
  • 描述E-R图,E-R图举例,关于C语言中E-R图的详解
  • 折半查找法C语言,折半查找算法(算法设计题)
  • 折半查找法C语言,c语言折半法查找数据,C语言实现折半查找法(二分法)
  • 扫雷小游戏c++代码设计,c语言扫雷游戏源代码,C语言实现扫雷小游戏详细代码
  • 怎样统计程序代码行数,C语言统计行数,C#程序员统计自己的代码行数
  • 基于c语言的贪吃蛇游戏程序设计,用c语言编写贪吃蛇游戏程序,C语言实现简单的贪吃蛇游戏
  • 图的两种遍历算法,图的遍历算法代码c语言,Python算法之图的遍历
  • 留言与评论(共有 条评论)
       
    验证码: