windows获取高精度时间

如果当前系统中支持高分辨率计数器,我们可以使用 QueryPerformanceCounter 和 QueryPerformanceFrequency 进行高分辨率的计时。

QueryPerformanceFrequency()
类型:Win32API
原型:BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
作用:返回硬件支持的高精度计数器的频率。
返回值:非零,硬件支持高精度计数器;零,硬件不支持,读取失败

函数QueryPerformanceCounter用于得到高精度计时器的值(如果存在这样的计时器)
原型:BOOL QueryPerformanceCounter(LARGE_INTEGER *ipPerformanceCount);//参数指向计数器的值
参数: LARGE_INTEGER *ipProformanceCount
为一个指针变量用于函数传值,即指向现时计数器的值.如果安装的硬件不支持高精度计时器,该参数将返回0,
返回值:
如果安装的硬件支持高精度计时器,函数将返回非0值.
如果安装的硬件不支持高精度计时器,函数将返回0

一个时间类的实现

View Code
// ------------------------------  header file -----------------------
#pragma once
#include <Windows.h>
class CTime
{
private:
    CTime(void);
    ~CTime(void);
public:
    static UINT64 GetMilliS();//毫秒
    static UINT64 GetMicroS();//微秒
    static UINT64 GetNanoS();//纳秒
private:
    static UINT64 m_frequency;
    static CTime m_self;
};

// -------------------------------- CTime.cpp ------------------------------
#include "ctime.h"
#include <assert.h>

UINT64    CTime::m_frequency = 0;
CTime    CTime::m_self;

CTime::CTime(void)
{
    LARGE_INTEGER fc;

    if (!QueryPerformanceFrequency(&fc))
    {
        assert(FALSE);
    }
    m_frequency = fc.QuadPart;  //计时器的频率
}

CTime::~CTime(void)
{
}

UINT64 CTime::GetMilliS()
{
    assert(m_frequency>1000);
    LARGE_INTEGER fc;
    if (!QueryPerformanceCounter(&fc))
    {
        assert(FALSE);
    }

    UINT64 c = fc.QuadPart;
    UINT64 s = (c) / (m_frequency / 1000);
    return s;
}

UINT64 CTime::GetMicroS()
{
    assert(m_frequency>1000*1000);

    LARGE_INTEGER fc;

    if (!QueryPerformanceCounter(&fc))
    {
        assert(FALSE);
    }

    UINT64 c = fc.QuadPart;
    UINT64 s = (c) / (m_frequency / 1000 / 1000);
    return s;
}

UINT64 CTime::GetNanoS()
{
    assert(m_frequency>1000*1000*1000);

    LARGE_INTEGER fc;

    if (!QueryPerformanceCounter(&fc))
    {
        assert(FALSE);
    }
    UINT64 c = fc.QuadPart;
    UINT64 s = (c) / (m_frequency / 1000 / 1000 / 1000);
    return s;
}

如果系统不支持高精度计时器,可以使用GetTickCount(),精度是毫秒。还可以使用clock(),其精度也是毫秒。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值