博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
计算程序运行时间的方法
阅读量:5139 次
发布时间:2019-06-13

本文共 4385 字,大约阅读时间需要 14 分钟。

转自:

1

这个是windows里面常用来计算程序运行时间的函数;
DWORD dwStart = GetTickCount();
//这里运行你的程序代码
DWORD dwEnd = GetTickCount();
则(dwEnd-dwStart)就是你的程序运行时间, 以毫秒为单位
这个函数只精确到55ms,1个tick就是55ms。

1 #include 
2 #include
3 using namespace std; 4 int main(int argc, char* argv[]) 5 { 6 DWORD start, end; 7 8 start = GetTickCount(); 9 for(int i=0;i<1000;i++)10 cout<<"you are a good child!"<

2

timeGetTime()基本等于GetTickCount(),但是精度更高

1 DWORD dwStart = timeGetTime();2 3 //这里运行你的程序代码4 5 DWORD dwEnd = timeGetTime();

则(dwEnd-dwStart)就是你的程序运行时间, 以毫秒为单位

虽然返回的值单位应该是ms,但传说精度只有10ms。

1 #include 
2 #include
3 #pragma comment(lib,"winmm.lib") 4 5 using namespace std; 6 int main(int argc, char* argv[]) 7 { 8 DWORD start, end; 9 10 start = timeGetTime();11 for(int i=0;i<100;i++)12 cout<<"you are a good child!"<

3
用clock()函数,得到系统启动以后的毫秒级时间,然后除以CLOCKS_PER_SEC,就可以换成“秒”,标准c函数。
clock_t clock ( void );
#include <time.h>
clock_t t = clock();
long sec = t / CLOCKS_PER_SEC;
他是记录时钟周期的,实现看来不会很精确,需要试验验证;
4

1 #include
2 #include
//
3 using namespace std; 4 int main() 5 { 6 time_t begin,end; 7 8 double duration; 9 begin=clock(); 10 //这里加上你的代码 11 end=clock();12 13 duration=double(end-begin)/CLOCKS_PER_SEC;14 cout<<"runtime: "<
<

 


5
unix时间相关,也是标准库的
这些在<time.h>
1.timegm函数只是将struct tm结构转成time_t结构,不使用时区信息;
time_t timegm(struct tm *tm);
2.mktime使用时区信息
time_t mktime(struct tm *tm);
timelocal 函数是GNU扩展的与posix函数mktime相当
time_t timelocal (struct tm *tm);
3.gmtime函数只是将time_t结构转成struct tm结构,不使用时区信息;
struct tm * gmtime(const time_t *clock);
4.localtime使用时区信息
struct tm * localtime(const time_t *clock);
1.time获取时间,stime设置时间
time_t t;
t = time(&t);
2.stime其参数应该是GMT时间,根据本地时区设置为本地时间;
int stime(time_t *tp)
3.UTC=true 表示采用夏时制;
4.文件的修改时间等信息全部采用GMT时间存放,不同的系统在得到修改时间后通过localtime转换成本地时间;
5.设置时区推荐使用setup来设置;
6.设置时区也可以先更变/etc/sysconfig/clock中的设置 再将ln -fs /usr/share/zoneinfo/xxxx/xxx /etc/localtime 才能重效
time_t只能表示68年的范围,即mktime只能返回1970-2038这一段范围的time_t
看看你的系统是否有time_t64,它能表示更大的时间范围
Window里面的一些不一样的
CTime MFC类,好像就是把time.h封了个类,没扩展
CTime t = GetCurrentTime();
SYSTEMTIME 结构包含毫秒信息

1 typedef struct _SYSTEMTIME {  2 WORD wYear;  3 WORD wMonth;  4 WORD wDayOfWeek;  5 WORD wDay;  6 WORD wHour;  7 WORD wMinute;  8 WORD wSecond;  9 WORD wMilliseconds;10 } SYSTEMTIME, *PSYSTEMTIME;11 12 SYSTEMTIME t1;13 GetSystemTime(&t1)14 CTime curTime(t1);15 WORD ms = t1.wMilliseconds;16 17 SYSTEMTIME sysTm;18 ::GetLocalTime(&sysTm);

 


在time.h中的_strtime() //只能在windows中用
char t[11];
_strtime(t);
puts(t);
6
下面是转的一个用汇编的精确计时方法
---------------------------------------------------------------------------------------
如何获得程序或者一段代码运行的时间?你可能说有专门的程序测试工具,确实,不过你也可以在程序中嵌入汇编代码来实现。
在Pentium的指令系统中有一条指令可以获得CPU内部64位计数器的值,我们可以通过代码两次获取该计数器的值而获得程序或代码运行的时钟周期数,进而通过你的cpu的频率算出一个时钟周期的时间,从而算出程序运行的确切时间。
我们通过指令TDSIC来获得cpu内部计数器的值,指令TDSIC返回值放在EDX:EAX中,其中EDX中存放64位寄存器中高32位的值,EAX存放第32位的值.
下面看看实现的代码:
//用汇编实现获取一段代码运行的时间

1 #include
2 3 using namespace std; 4 5 void GetClockNumber (long high, long low); 6 void GetRunTime(); 7 8 int main() 9 { 10 11 long HighStart,LowStart,HighEnd,LowEnd;12 long numhigh,numlow;13 //获取代码运行开始时cpu内部计数器的值14 __asm 15 {16 RDTSC17 mov HighStart, edx18 mov LowStart, eax19 }20 for(int i= 0; i<100000; i++ )21 {22 for(int i= 0; i<100000; i++ )23 {24 25 }26 27 }28 //获取代码结束时cpu内部计数器的值,并减去初值29 __asm30 {31 RDTSC32 mov HighEnd, edx33 Mov LowEnd, eax34 ;获取两次计数器值得差35 sub eax, LowStart36 cmp eax, 0 ; 如果低32的差为负则求返,因为第二次取得永远比第一次的大37 jg L138 neg eax39 jmp L240 L1: mov numlow, eax41 L2: sbb edx, HighStart42 mov numhigh, edx43 44 }45 //把两个计数器值之差放在一个64位的整形变量中46 //先把高32位左移32位放在64的整形变量中,然后再加上低32位47 __int64 timer =(numhigh<<32) + numlow;48 //输出代码段运行的时钟周期数49 //以频率1.1Gcpu为例,如果换计算机把其中的1.1改乘其它即可,因为相信大家的cpu都应该在1G以上 ^_^50 cout<< (double) (timer /1.1/1000000000) << endl;51 return 0;52 }

 


   这样通过一条简单的汇编指令就可以获得程序或一段代码的大概时间,不过并不能得到运行的确切时间,因为即使去掉中间的循环,程序也会有个运行时间,
因为在第一次取得计数器的值后,有两条汇编指令mov HighStart, edx    mov LowStart, eax这两条指令当然也有运行时间 ,当然你可以减去这两条指令的运行时间(在1.1G的机子上是3e-8s),这样会更精确一点。
如果你要确切知道程序的运行时间,专业的测试软件肯定会更好一点,不过好像一般没有必要获取除非专门的要求的程序。
不过能DIY一个也是不错的,不管有没有,最起码你可以学到在VC++中如何嵌入汇编代码以及如何使用32位的寄存器,其实和16位的寄存器一样使用,将来64的也应该一样,只不过位数不同罢了

转载于:https://www.cnblogs.com/zxj015/archive/2011/05/22/2740206.html

你可能感兴趣的文章
按照excel文档中的内容在当前cad图纸中自动排布实体
查看>>
Winform开发框架之图表报表在线设计器2-图表-SNF.EasyQuery项目--SNF快速开发平台3.3-Spring.Net.Framework...
查看>>
C#基础第八天-作业-设计类-面向对象方式实现两个帐户之间转账
查看>>
洛谷 P3237 [HNOI2014]米特运输
查看>>
Attributes.Add用途与用法
查看>>
JavaScript面向对象初探——封装和继承
查看>>
L2-001 紧急救援 (dijkstra+dfs回溯路径)
查看>>
【概率】poj 2096:Collecting Bugs
查看>>
javascript 无限分类
查看>>
【自制插件】MMD4Maya
查看>>
解决linux服务器乱码
查看>>
mapbox.gl文字标注算法基本介绍
查看>>
【C++】异常简述(二):C++的异常处理机制
查看>>
web.config在哪里
查看>>
SQL Server 2000 版本支持的最大物理内存量
查看>>
spring IOC装配Bean(注解方式)
查看>>
[面试算法题]有序列表删除节点-leetcode学习之旅(4)
查看>>
SpringBoot系列五:SpringBoot错误处理(数据验证、处理错误页、全局异常)
查看>>
kubernetes_book
查看>>
Redis 常用数据结构命令
查看>>