Windows 计算程序运行时间(高精度计时)
首先,认识一下clock()和GetTickCount():
一、clock()
clock()是C/C++中的计时函数,而与其相关的数据类型是clock_t。在MSDN中,查得对clock函数定义如下:
clock_t clock(void) ;
简单而言,就是该程序从启动到函数调用占用CPU的时间。这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock);若挂钟时间不可取,则返回-1。其中clock_t是用来保存时间的数据类型。
在time.h文件中,我们可以找到对它的定义:
- #ifndef _CLOCK_T_DEFINED
 - typedef long clock_t;
 - #define _CLOCK_T_DEFINED
 - #endif
 
clock_t是一个长整形数。在time.h文件中,还定义了一个常量CLOCKS_PER_SEC,它用来表示一秒钟会有多少个时钟计时单元,其定义如下:
#define CLOCKS_PER_SEC ((clock_t)1000)
可以看到每过千分之一秒(1毫秒),调用clock()函数返回的值就加1。简单的说就是clock()可以精确到1毫秒。
在linux系统下,CLOCKS_PER_SEC的值可能有所不同,目前使用的linux打印出来的值是1000000,表示的是微秒。这一点需要注意。
二、GetTickCount()
GetTickcount函数:它返回从操作系统启动到当前所经过的毫秒数,它的返回值是DWORD。常常用来判断某个方法执行的时间,其函数原型是DWORD GetTickCount(void),返回值以32位的双字类型DWORD存储,因此可以存储的最大值是(2^32-1) ms约为49.71天,因此若系统运行时间超过49.71天时,这个数就会归0,MSDN中也明确的提到了:"Retrieves the number of milliseconds that have elapsed since the system was started, up to 49.7 days."。因此,如果是编写服务器端程序,此处一定要万分注意,避免引起意外的状况。
特别注意:这个函数并非实时发送,而是由系统每18ms发送一次,因此其最小精度为18ms。当需要有小于18ms的精度计算时,应使用StopWatch方法进行。
使用clock计算时间差:
- #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;
 - }
 
使用GetTickCount计算时间差:
- #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;
 - }
 
可以得出结论:clock比GetTickCount具有更高的精度,所以如果需要更高精度的时间差,则建议使用clock。在程序耗时统计时,可以使用clock来帮助完成时间差的计算。
三、如果需要更高的时间精度(比如说服务器程序的耗时统计),可以在开始计时统计前先调用QueryPerformanceFrequency()函数获得机器内部计时器的时钟频率,接着在需要严格计时的事件发生前和发生之后分别调用QueryPerformanceCounter(),利用两次获得的计数之差和时钟频率,就可以计算出事件经历的精确时间(精度可以达到微秒级别)。下面是示例代码:
- #include <windows.h>
 - #include <iostream>
 - int main()
 - {
 - LARGE_INTEGER timeStart; //开始时间
 - LARGE_INTEGER timeEnd; //结束时间
 - LARGE_INTEGER frequency; //计时器频率
 - QueryPerformanceFrequency(&frequency);
 - double quadpart = (double)frequency.QuadPart;//计时器频率
 - QueryPerformanceCounter(&timeStart);
 - Sleep(1000);//延时一秒
 - QueryPerformanceCounter(&timeEnd);
 - //得到两个时间的耗时
 - double elapsed = (timeEnd.QuadPart - timeStart.QuadPart) / quadpart;
 - std::cout << elapsed << std::endl;//单位为秒,精度为微秒(1000000/cpu主频)
 - system("pause");
 - return 0;
 - }
 
多运行几次,可以看到,每次Sleep耗费的时间都不一样,所以sleep的时间精度是很低的!
https://blog.csdn.net/hellokandy/article/details/51330028
Windows 计算程序运行时间(高精度计时)的更多相关文章
- windows下C++高精度计时
		
写代码时,经常会计算某一段代码的运行时间,以下提供一个微秒级别的类供参考 class CTimeCost { public: CTimeCost(const string &str) : m_ ...
 - C++获取当前时间和计算程序运行时间的方法
		
C++获取当前时间和计算程序运行时间的方法 获取当前时间: #include <iostream> #include <Windows.h> using namespace s ...
 - c++ 计算程序运行时间
		
转载 http://blog.csdn.net/trustbo/article/details/10582287 以前经常听人提起如何计算程序运行时间,给出一系列函数,当时没有注意,随便选了clock ...
 - VC/MFC中计算程序运行时间
		
转自原文VC/MFC中计算程序运行时间 说明,这四种方法也分别代表了类似的实现,在MFC中,所可以从哪些类集合去考虑. 方法一 利用GetTickCount函数(ms) CString str; lo ...
 - Python组织文件 实践:查找大文件、 用Mb、kb显示文件尺寸 、计算程序运行时间
		
这个小程序很简单原本没有记录下来的必要,但在编写过程中又让我学到了一些新的知识,并且遇到了一些不能解决的问题,然后,然后就很有必要记录一下. 这个程序的关键是获取文件大小,本来用 os.path.ge ...
 - [转]使用Stopwatch类实现高精度计时
		
对一段代码计时同查通常有三种方法.最简单就是用DateTime.Now来进行比较了,不过其精度只有3.3毫秒,可以通过DllImport导入QueryPerformanceFrequency和Quer ...
 - Windows下获取高精度时间注意事项
		
Windows下获取高精度时间注意事项 [转贴 AdamWu] 花了很长时间才得到的经验,与大家分享. 1. RDTSC - 粒度: 纳秒级 不推荐优势: 几乎是能够获得最细粒度的计数器抛弃理由: ...
 - 几个代码片段-计算程序运行时间+获得当前目录+生成MD5
		
计算程序运行时间 long startTime = System.currentTimeMillis(); System.out.println("程序运行时间: " + (Sys ...
 - C语言计算程序运行时间
		
#include<stdio.h>#include<stdlib.h> #include "time.h" int main( void ) { ...
 
随机推荐
- [React & Testing] Snapshot testings
			
For example we have a React comonent: -- A toggle button, we want to test. When it si toggle on, the ...
 - 2lession-文件访问
			
今天继续学习python,因为是根据网上的教程,里面用到了一些例子,包含有后面的知识点.但是,因为自己稍微有点c.java等语言基础,所以并没有严格按照教程来学习,反而是遇到知识点就记录下来. 代码如 ...
 - HTML基础第七讲---框架
			
转自:https://i.cnblogs.com/posts?categoryid=1121494 框架(Frame)也就是所谓的分割窗口.分割画面.框窗效果(还真是五花八门),这个技巧在运用上问题比 ...
 - 1.1 Introduction中  Guarantees官网剖析(博主推荐)
			
不多说,直接上干货! 一切来源于官网 http://kafka.apache.org/documentation/ Guarantees Kafka的保证(Guarantees) At a high- ...
 - angular反向代理
			
第一步:根目录新建 proxy.conf.json target:就是代理的服务器地址. 接口地址必须是http://localhost:8081/api开头 { "/api":{ ...
 - [JSOI2009]计数问题
			
一个n*m的方格,初始时每个格子有一个整数权值.接下来每次有2种操作: 改变一个格子的权值: 求一个子矩阵中某种特定权值出现的个数. 输入输出格式 输入格式: 第一行有两个数N,M. 接下来N行,每行 ...
 - POJ 3264 Balanced Lineup    线段树RMQ
			
http://poj.org/problem?id=3264 题目大意: 给定N个数,还有Q个询问,求每个询问中给定的区间[a,b]中最大值和最小值之差. 思路: 依旧是线段树水题~ #include ...
 - [D3] Create DOM Elements with D3 v4
			
Change is good, but creating from scratch is even better. This lesson shows you how to create DOM el ...
 - thinkphp模拟请求和参数绑定
			
thinkphp模拟请求和参数绑定 一.总结 1.网页传过来的参数是可以修改的:get或者post等方式 传过来的参数是可以修改的 dump($request->get(['id'=>2 ...
 - 利用Eclipse+openJTAG调试led.axf文件
			
转自calvinlee1984 Subject:利用Eclipse+openJTAG调试led.axf文件 Date: 3-Mar-2011 By: Calvinlee1984 ...