Qt测算程序运行时间

Qt测算程序运行时间

分类: Qt 410人阅读 评论(0) 收藏 举报

【问题描述】程序运行时间是编程的一项重要指标,在QT中如何测算程序的运行时间呢?

【解析】

测试函数

  1. #include <math.h>  
  2.   
  3. void function()  
  4. {  
  5.     unsigned int i,j;  
  6.     double y;  
  7.   
  8.     for(i=0;i<1000;i++)  
  9.         for(j=0;j<1000;j++)  
  10.             y=sin((double)i);  
  11. }  
#include <math.h>

void function()
{
    unsigned int i,j;
    double y;

    for(i=0;i<1000;i++)
        for(j=0;j<1000;j++)
            y=sin((double)i);
}

 

方法1 利用QTime,其精度为ms级

  1. #include <QDebug>  
  2. #include <QTime>  
  3.   
  4. QTime time;  
  5.   
  6. time.start();  
  7. function();  
  8.   
  9. qDebug()<<time.elapsed()/1000.0<<"s";  
#include <QDebug>
#include <QTime>

QTime time;

time.start();
function();

qDebug()<<time.elapsed()/1000.0<<"s";

运行结果:0.109 s

方法2 利用gettimeofday(),其精度为us级

  1. #include <QDebug>  
  2. #include <sys/time.h>  
  3.   
  4. struct timeval tpstart,tpend;  
  5. float timeuse;  
  6.   
  7. gettimeofday(&tpstart,NULL);  
  8. function();  
  9. gettimeofday(&tpend,NULL);  
  10. timeuse=(1000000*(tpend.tv_sec-tpstart.tv_sec) + tpend.tv_usec-tpstart.tv_usec)/1000000.0;  
  11.   
  12. qDebug()<<timeuse<<"s";  
#include <QDebug>
#include <sys/time.h>

struct timeval tpstart,tpend;
float timeuse;

gettimeofday(&tpstart,NULL);
function();
gettimeofday(&tpend,NULL);
timeuse=(1000000*(tpend.tv_sec-tpstart.tv_sec) + tpend.tv_usec-tpstart.tv_usec)/1000000.0;

qDebug()<<timeuse<<"s";

运行结果:0.109375 s


方法3 利用clock(),其精度为ms级

 
 
  1. #include <QDebug>  
  2. #include <sys/time.h>  
  3.   
  4. double time_Start = (double)clock();  
  5. function();  
  6. double time_End = (double)clock();  
  7.       
  8. qDebug()<<(time_End - time_Start)/1000.0<<"s";  
#include <QDebug>
#include <sys/time.h>

double time_Start = (double)clock();
function();
double time_End = (double)clock();
    
qDebug()<<(time_End - time_Start)/1000.0<<"s";

运行结果:0.11 s


方法4 利用windows.h(VC)函数,提精度为us级

 

QueryPerformanceFrequency() - 基本介绍

类型:Win32API

原型:BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);

作用:返回硬件支持的高精度计数器的频率。

返回值:非零,硬件支持高精度计数器;零,硬件不支持,读取失败。

QueryPerformanceFrequency() - 技术特点

供WIN9X使用的高精度定时器:QueryPerformanceFrequency()和QueryPerformanceCounter(),要求计算机从硬件上支持高精度定时器。

函数的原形是:
  BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
  BOOL QueryPerformanceCounter (LARGE_INTEGER *lpCount);

数据类型LARGEINTEGER既可以是一个作为8字节长的整数,也可以是作为两个4字节长的整数的联合结构,其具体用法根据编译器是否支持64位而定。该类型的定义如下:
  typeef union _ LARGE_INTEGER
  {
   struct
   {
   DWORD LowPart;
   LONG HighPart;
   };
   LONGLONG QuadPart;
  } LARGE_INTEGER;

在定时前应该先调用QueryPerformanceFrequency()函数获得机器内部计时器的时钟频率。接着在需要严格计时的事件发生前和发生之后分别调用QueryPerformanceCounter(),利用两次获得的计数之差和时钟频率,就可以计算出事件经历的精确时间。测试函数SLEEP(100)的精确持续时间方法:
  LARGE_INTEGER litmp;
  LONGLONG qt1,qt2;
  double dft,dff,dfm;
  QueryPerformanceFrequency(&litmp);//获得时钟频率
  dff=(double)litmp.QuadPart;
  QueryPerformanceCounter(&litmp);//获得初始值
  qt1=litmp.QuadPart;Sleep(100);
  QueryPerformanceCounter(&litmp);//获得终止值
  qt2=litmp.QuadPart;
  dfm=(double)(qt2-qt1);
  dft=dfm/dff;//获得对应的时间值

需要注意的是DFT计算的结果单位是秒。

 

QueryPerformanceFrequency高精度计时

 

分类: windows 68人阅读 评论(0) 收藏 举报

利用这两个函数可以创建跟硬件时钟的晶振一样精确的计时器。

在进行定时之前,先调用QueryPerformanceFrequency()函数获得机器内部定时器的时钟频率, 然后在需要严格定时的事件发生之前和发生之后分别调用QueryPerformanceCounter()函数,利用两次获得的计数之差及时钟频率,计算出事件经 历的精确时间。



1.如下函数查询cpu时钟频率,(如我的cpu是2.89GHz,得到2893460000)
BOOL QueryPerformanceFrequency( LARGE_INTEGER *lpFrequency   // current frequency);

2.再获取高精确度性能计数器的值
BOOL QueryPerformanceCounter(  LARGE_INTEGER *lpPerformanceCount   // counter value);
计数器的值除以频率得到当前系统运行时间(秒):
LARGE_INTEGER  startTime = (*lpPerformanceCount) /(*lpFrequency )

3.运行所需计时的代码段后再次获取性能计数器的值
BOOL QueryPerformanceCounter(  LARGE_INTEGER *lpPerformanceCount2   // counter value);
计数器的值除以频率得到当前系统运行时间(秒):
LARGE_INTEGER endTime =(*lpPerformanceCount2) /(*lpFrequency )

4.endTime-startTime即为两次调用QueryPerformanceCounter期间的精度计时时间。
这结果是秒级的,如果要更精确的可以将时钟频率除以相应值再作后面计算。
如要获得毫秒级的:LARGE_INTEGER  tick=*lpFrequency/1000
LARGE_INTEGER  startTime = (*lpPerformanceCount) /tick
LARGE_INTEGER endTime =(*lpPerformanceCount2) /tick
endTime-startTime

 

  1. #include <QDebug>  
  2. #include <windows.h>  
  3.   
  4. LARGE_INTEGER litmp;  
  5. LONGLONG Qpart1,Qpart2,Useingtime;  
  6. double dfMinus,dfFreq,dfTime;  
  7.   
  8. //获得CPU计时器的时钟频率  
  9. QueryPerformanceFrequency(&litmp);//取得高精度运行计数器的频率f,单位是每秒多少次(n/s),  
  10. dfFreq = (double)litmp.QuadPart;  
  11.   
  12. QueryPerformanceCounter(&litmp);//取得高精度运行计数器的数值  
  13. Qpart1 = litmp.QuadPart; //开始计时  
  14.   
  15. function(); //待测试的计算函数等  
  16.   
  17. QueryPerformanceCounter(&litmp);//取得高精度运行计数器的数值  
  18. Qpart2 = litmp.QuadPart; //终止计时  
  19.   
  20. dfMinus = (double)(Qpart2 - Qpart1);//计算计数器值  
  21. dfTime = dfMinus / dfFreq;//获得对应时间,单位为秒,可以乘1000000精确到微秒级(us)  
  22. Useingtime = dfTime*1000000;  
  23.   
  24. qDebug()<<dfTime<<"s";  
#include <QDebug>
#include <windows.h>

LARGE_INTEGER litmp;
LONGLONG Qpart1,Qpart2,Useingtime;
double dfMinus,dfFreq,dfTime;

//获得CPU计时器的时钟频率
QueryPerformanceFrequency(&litmp);//取得高精度运行计数器的频率f,单位是每秒多少次(n/s),
dfFreq = (double)litmp.QuadPart;

QueryPerformanceCounter(&litmp);//取得高精度运行计数器的数值
Qpart1 = litmp.QuadPart; //开始计时

function(); //待测试的计算函数等

QueryPerformanceCounter(&litmp);//取得高精度运行计数器的数值
Qpart2 = litmp.QuadPart; //终止计时

dfMinus = (double)(Qpart2 - Qpart1);//计算计数器值
dfTime = dfMinus / dfFreq;//获得对应时间,单位为秒,可以乘1000000精确到微秒级(us)
Useingtime = dfTime*1000000;

qDebug()<<dfTime<<"s";

运行结果:0.107415 s

 

【代码清单】 

  1. #include <QDebug>  
  2. #include <QTime>  
  3. #include <sys/time.h>  
  4. #include <windows.h>  
  5. #include <math.h>  
  6.   
  7. void function();  
  8.   
  9. int main(void)  
  10. {  
  11.     qDebug()<<"-------------------------------";  
  12.     //-1-  
  13.     QTime time;  
  14.     time.start();  
  15.     function();  
  16.     qDebug()<<time.elapsed()/1000.0<<"s";  
  17.   
  18.     //-2-  
  19.     struct timeval tpstart,tpend;  
  20.     float timeuse;  
  21.     gettimeofday(&tpstart,NULL);  
  22.     function();  
  23.     gettimeofday(&tpend,NULL);  
  24.     timeuse=(1000000*(tpend.tv_sec-tpstart.tv_sec) + tpend.tv_usec-tpstart.tv_usec)/1000000.0;  
  25.     qDebug()<<timeuse<<"s";  
  26.   
  27.     //-3-  
  28.     double time_Start = (double)clock();  
  29.     function();  
  30.     double time_End = (double)clock();  
  31.     qDebug()<<(time_End - time_Start)/1000.0<<"s";  
  32.   
  33.     //-4-  
  34.     LARGE_INTEGER litmp;  
  35.     LONGLONG Qpart1,Qpart2,Useingtime;  
  36.     double dfMinus,dfFreq,dfTime;  
  37.   
  38.     //获得CPU计时器的时钟频率  
  39.     QueryPerformanceFrequency(&litmp);//取得高精度运行计数器的频率f,单位是每秒多少次(n/s),  
  40.     dfFreq = (double)litmp.QuadPart;  
  41.   
  42.     QueryPerformanceCounter(&litmp);//取得高精度运行计数器的数值  
  43.     Qpart1 = litmp.QuadPart; //开始计时  
  44.   
  45.     function(); //待测试的计算函数等  
  46.   
  47.     QueryPerformanceCounter(&litmp);//取得高精度运行计数器的数值  
  48.     Qpart2 = litmp.QuadPart; //终止计时  
  49.   
  50.     dfMinus = (double)(Qpart2 - Qpart1);//计算计数器值  
  51.     dfTime = dfMinus / dfFreq;//获得对应时间,单位为秒,可以乘1000000精确到微秒级(us)  
  52.     Useingtime = dfTime*1000000;  
  53.   
  54.     qDebug()<<dfTime<<"s";  
  55.   
  56.     return 0;  
  57. }  
  58.   
  59. void function()  
  60. {  
  61.     unsigned int i,j;  
  62.     double y;  
  63.   
  64.     for(i=0;i<1000;i++)  
  65.         for(j=0;j<1000;j++)  
  66.             y=sin((double)i);  
  67. }  
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值