c/c++在windows下获取时间和计算时间差的几种方法总结 【转】
http://blog.csdn.net/coder_xia/article/details/6566708
一、标准C和C++都可用
1、获取时间用time_t time( time_t * timer ),计算时间差使用double difftime( time_t timer1, time_t timer0 )。 精确到秒。
测试程序如下:
- #include <time.h>
- #include <stdio.h>
- int main()
- {
- time_t start ,end ;
- double cost;
- time(&start);
- sleep(1);
- time(&end);
- cost=difftime(end,start);
- printf("%f/n",cost);
- return 0;
- }
本程序在fedora9测试通过。
关于代码中的sleep函数,需要注意的是:
1)在windows下,为Sleep函数,且包含windows.h
2)关于sleep中的数,在Windows和Linux下1000代表的含义并不相同,Windows下的表示1000毫秒,也就是1秒钟;Linux下表示1000秒,Linux下使用毫秒级别的函数可以使用usleep。
2、clock_t clock(),clock()
获取的是计算机启动后的时间间隔,得到的是CPU时间,精确到1/CLOCKS_PER_SEC秒。
测试程序如下:
- #include <time.h>
- #include <stdio.h>
- int main()
- {
- double start,end,cost;
- start=clock();
- sleep(1);
- end=clock();
- cost=end-start;
- printf("%f/n",cost);
- return 0;
- }
二、C++中(此处针对windows环境,标准c中则linux和windows都可以)
1、GetTickCount()
调用函数需包含windows.h。得到的是系统运行的时间 精确到毫秒,测试程序如下:
- #include <iostream>
- #include <windows.h>
- using namespace std;
- int main()
- {
- double start = GetTickCount();
- Sleep(1000);
- double end=GetTickCount();
- cout << "GetTickCount:" << end-start << endl;
- return 0;
- }
2、GetLocalTime()
获得的是结构体保存的year,month等信息。而C语言time函数获得是从1970年1月1日0时0分0秒到此时的秒数。需要gmtime函数转换为常用的日历(返回的是世界时间,要显示常用的时间,则为localtime函数)。
在c语言中,保存常用日历的结构体为struct tm,包含在time.h中,c++语言为SYSTEMTIME结构体,包含在winbase.h(编程包含windows.h即可)。当然,精度肯定为秒了。
测试程序如下:
- #include <iostream>
- #include <windows.h>
- using namespace std;
- int main()
- {
- SYSTEMTIME start; //windows.h中
- GetLocalTime(&start);//time.h的tm结构体一样的效果
- cout<< start.year << endl;
- }
c语言的gmtime方法的示范代码如下:
- #include <time.h>
- #include <stdio.h>
- #include <stdlib.h>
- int main()
- {
- struct tm *tm_ptr;
- time_t the_time;
- (void) time(&the_time);
- tm_ptr = gmtime(&the_time);
- printf("Raw time is %ld/n", the_time);
- printf("gmtime gives:/n");
- printf("date: %02d/%02d/%02d/n",
- tm_ptr->tm_year, tm_ptr->tm_mon+1, tm_ptr->tm_mday);
- printf("time: %02d:%02d:%02d/n",
- tm_ptr->tm_hour, tm_ptr->tm_min, tm_ptr->tm_sec);
- exit(0);
- }
另外,c语言有类似于GetLocalTime方法的函数ctime()。
对localtime(),原型为:struct tm *localtime(const time_t *timep);将测试程序的gmtime改为localtime,则可以看到输出的时间为争取时间和日期了。为了更友好的得到时间和日期,像date那样输出,可以用asctime或ctime函数,原型:char *ctime(const time_t *timeval);测试代码如下:
- #include <time.h>
- #include <stdio.h>
- #include <stdlib.h>
- int main()
- {
- time_t the_time;
- time(&the_time);
- printf("The date is : %s /n" , ctime(&the_time));
- exit(0);
- }
3、要获取高精度时间,可以使用
BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency)获取系统的计数器的频率
BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount)获取计数器的值
然后用两次计数器的差除以Frequency就得到时间。
测试程序如下:
- #include <iostream>
- #include <windows.h>
- using namespace std;
- int main()
- {
- LARGE_INTEGER m_nFreq;
- LARGE_INTEGER m_nBeginTime;
- LARGE_INTEGER nEndTime;
- QueryPerformanceFrequency(&m_nFreq); // 获取时钟周期
- QueryPerformanceCounter(&m_nBeginTime); // 获取时钟计数
- Sleep(100);
- QueryPerformanceCounter(&nEndTime);
- cout << (double)(nEndTime.QuadPart-m_nBeginTime.QuadPart)*1000/m_nFreq.QuadPart << endl;
- }
需要注意的就是结果需要强制转换为double,不然会得到如下错误:<< is ambiguous。
4、timeGetTime()。
精度:毫秒,与GetTickCount()相当。使用需要包含windows.h,并加入Winmm.lib(虽然查到资料说需要包含mmsystem.h,不过经验证,可以不用包含)。测试代码如下:
- #include <iostream>
- #include <windows.h>//GetTickCount
- //#include <mmsystem.h>
- using namespace std;
- int main()
- {
- DWORD start = timeGetTime();//
- Sleep(1000);
- DWORD end= timeGetTime();//
- cout << timeGetTime() << endl;
- return 0;
- }
5、MFC中,CTime::GetCurrentTime() 精确到秒,不列出测试代码。
关于定时器什么的,目前用到地方不多,就不总结了
参考网址:
1、http://blog.csdn.net/wallaceli1981/archive/2009/10/24/4723218.aspx
c/c++在windows下获取时间和计算时间差的几种方法总结 【转】的更多相关文章
- 【转载】c/c++在windows下获取时间和计算时间差的几种方法总结
一.标准C和C++都可用 1.获取时间用time_t time( time_t * timer ),计算时间差使用double difftime( time_t timer1, time_t time ...
- c++ 在windows下获取时间和计算时间差的几种方法总结
http://blog.csdn.net/caimagic/article/details/50696609 我用的是GetTickCount(), 获取到的是毫秒.
- c和c++在windows下获取时间和计算时间差的方法总结
c/c++在windows下获取时间和计算时间差的几种方法总结 一.标准C和C++都可用 1.获取时间用time_t time( time_t * timer ),计算时间差使用double diff ...
- Windows下Apache+MySQL+PHP快速配置的几种方法
Apache MySQL PHP Windows WAMP 1.易思EasySiteServer服务器集成环境 v1.0 (推荐) 尔创互联为推广其ESPCMS而开发的一个小东东,很好用.零配置,完 ...
- Windows下获取高精度时间注意事项
Windows下获取高精度时间注意事项 [转贴 AdamWu] 花了很长时间才得到的经验,与大家分享. 1. RDTSC - 粒度: 纳秒级 不推荐优势: 几乎是能够获得最细粒度的计数器抛弃理由: ...
- windows下获取IP地址的两种方法
windows下获取IP地址的两种方法: 一种可以获取IPv4和IPv6,但是需要WSAStartup: 一种只能取到IPv4,但是不需要WSAStartup: 如下: 方法一:(可以获取IPv4和I ...
- Windows下获取本机IP地址方法介绍
Windows下获取本机IP地址方法介绍 if((hostinfo = gethostbyname(name)) != NULL) { #if 1 ; printf("IP COUNT: % ...
- C语言实现Windows下获取IP和MAC地址。
C语言实现Windows下获取IP和MAC地址. #include <winsock2.h> #include <stdio.h> #include <stdlib.h& ...
- .pages怎么在windows上打开?Windows下打开在Mac中编辑的.pages文件方法
.pages怎么在windows上打开?Windows下打开在Mac中编辑的.pages文件方法 1.最简单的方法是修改后缀名为.zip然后解压,解压后就可以看到一张图片,这个就是文档内容了. 2.更 ...
随机推荐
- POJ 1177 Picture(线段树:扫描线求轮廓周长)
题目链接:http://poj.org/problem?id=1177 题目大意:若干个矩形,求这些矩形重叠形成的图形的轮廓周长. 解题思路:这里引用一下大牛的思路:kuangbin 总体思路: 1. ...
- Django Ajax学习二之csrf跨站请求伪造
方式1 $.ajaxSetup({ data: {csrfmiddlewaretoken: '{{ csrf_token }}' }, }); 方式2 # html文件from表单中<form& ...
- 七:zooKeeper开源客户端ZkClient的api测试
ZkClient是Gitthub上一个开源的ZooKeeper客户端.ZKClient在ZooKeeper原生API接口之上进行了包装,是一个更加易用的ZooKeeper客户端.同时ZKClient在 ...
- hdu 1495(BFS)
非常可乐 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- python字符编码与解码 unicode,str
解释以下几个问题: (1)python2中str和unicode是两种字符串类型,与字符编码方式是什么关系? (2)str和unicode是怎么相互转换的? (3)'\x...':'\u...', ' ...
- “无法识别的配置节system.webServer”解决办法
在Winsows 2008 Server 上安装asp.net 1.1 的应用程序,在启用默认文档或者浏览目录时会向 web.config 文件添加 <system.webServer> ...
- 如何配置Java环境,包括JDK,Maven等
下载JDK并安装 搜索JDK,官网立马就出来了,下载之后个人觉得毕竟开发,毕竟这东西不大,C盘稳一点,安装在C盘可以的 配置 右键打开计算机->属性->高级系统设置->高级-> ...
- pytho中pickle、json模块
pickle & json 模块 json,用于字符串 和 python数据类型间进行转换 pickle,用于python特有的类型 和 python的数据类型间进行转换 json模块提供了四 ...
- Ajax使用进阶
关于Ajax的概念不再做解释了,我想通过三个小例子来让大家对Ajax有个清晰的认识.要学习它,必须从最基础最原始的方式开始认识,然后通过使用框架来提升效率,逐步认识它. 一.原生js版(注册的用户名是 ...
- UTF-8字符「EF BF BD」-备胎
在众多的utf-8码点值中,除了ascii,你还应该记住「EF BF BD」,因为它是很多编程语言以及库中的备胎,即无效的码点值在编码的时候会默认用这个码点值进行替换,即utf-8中的超级「备胎」(R ...