C++在Windows下的高精度计时器

一、需求描述

C++在Windows下,通过使用QueryPerformanceCounter可以实现毫秒级的高精度计时

题主在使用过程中主要有两个方面:秒表(计算某段代码的执行时间)和计时器(相当于sleep,但精度更高)

二、实现代码

1、秒表:计算某段代码的执行时间

#include <iostream>
#include <stdio.h>
#include <windows.h>
using namespace std;
int main()
{
	//初始化计时器
	LARGE_INTEGER nFreq;
	LARGE_INTEGER nBeginTime, nEndTime;
	double time = 0;
	QueryPerformanceFrequency(&nFreq);
	
    //取开始执行时间
	QueryPerformanceCounter(&nBeginTime);
		
    //这里填写需要执行的代码
			
    //取结束执行时间
	QueryPerformanceCounter(&nEndTime);
    //计算时间差
	time = (double)(nEndTime.QuadPart - nBeginTime.QuadPart) * 1000 / (double)nFreq.QuadPart;
		    
	system("pause");
	return 0;
}

2、计时器:sleep一段时间

#include <iostream>
#include <stdio.h>
#include <windows.h>
#include <thread>
using namespace std;
//设置时间间隔,单位:ms
const int nIntervalTime = 40;
int main()
{
	//初始化计时器
	LARGE_INTEGER nFreq;
	LARGE_INTEGER nBeginTime, nEndTime;
	double time = 0, Residual = 0, dThisTime = nIntervalTime;
	QueryPerformanceFrequency(&nFreq);
	while (true)
	{
        //取开始执行时间
		QueryPerformanceCounter(&nBeginTime);
		do
		{
            //取结束执行时间
			QueryPerformanceCounter(&nEndTime);
            //计算时间差
			time = (double)(nEndTime.QuadPart - nBeginTime.QuadPart) * 1000 / (double)nFreq.QuadPart;
		    //通过线程的等待来降低循环次数,达到减少CPU占用的目的
			if (time + 1 < nIntervalTime)
				this_thread::sleep_for(chrono::milliseconds((int)(nIntervalTime - time - 1)));
		} while (time < nIntervalTime);//当时间小于本次预计的时间时继续循环

        //这里填写定时结束后需要执行的程序

	}

	system("pause");
	return 0;
}

3、自适应计时器:sleep一段时间,根据代码执行时间,尽量保证代码固定频率执行(使用场景举例:某段代码需要以固定的时间间隔执行)

#include <iostream>
#include <stdio.h>
#include <windows.h>
#include <thread>
using namespace std;
//设置时间间隔,单位:ms
const int nIntervalTime = 40;
int main()
{
	//初始化计时器
	LARGE_INTEGER nFreq;
	LARGE_INTEGER nBeginTime, nEndTime;
	double time = 0, Residual = 0, dThisTime = nIntervalTime;
	QueryPerformanceFrequency(&nFreq);
	while (true)
	{
        //取开始执行时间
		QueryPerformanceCounter(&nBeginTime);
		
		//这里填写需要执行的代码
		
		do
		{
            //取结束执行时间
			QueryPerformanceCounter(&nEndTime);
            //计算时间差
			time = (double)(nEndTime.QuadPart - nBeginTime.QuadPart) * 1000 / (double)nFreq.QuadPart;
		    //通过线程的等待来降低循环次数,达到减少CPU占用的目的
			if (time + 1 < dThisTime)
				this_thread::sleep_for(chrono::milliseconds((int)(dThisTime - time - 1)));
		} while (time < dThisTime);//当时间小于本次预计的时间时继续循环
        //残余时间可能为正也可能为负
		Residual = dThisTime - time;
        //根据设置时间间隔和上一次执行的残余时间,计算下一次执行的时间
		dThisTime = nIntervalTime + Residual;
	}

	system("pause");
	return 0;
}

三、参考文档:

https://blog.csdn.net/alzzw/article/details/107780493

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值