Qt测算程序运行时间

来源:互联网 发布:浮云网货 淘宝小号 编辑:程序博客网 时间:2024/04/28 02:22

转载自:http://blog.csdn.net/tandesir/article/details/7821698

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

【解析】

测试函数

[html] view plaincopy
  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. }  

 

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

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

运行结果:0.109 s

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

[html] view plaincopy
  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";  

运行结果:0.109375 s


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

[html] view plaincopy
  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";  

运行结果:0.11 s


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

[html] view plaincopy
  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";  

运行结果:0.107415 s

 

【代码清单】 

[html] view plaincopy
  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. }  


 

 

转载请标明出处,仅供学习交流,勿用于商业目的

Copyright @ http://blog.csdn.net/tandesir


0 0