时间函数QueryPerformanceFrequency

介绍

我们在衡量一个函数的运行时间,或者判断一个算法的时间效率,或者在程序中我们需要一个定时器,定时执行一个特定的操作,都会用到时间函数。编译器和操作系统为我们提供了很多时间函数,这些时间函数的精度也是各不相同。所以,如果我们想得到准确的结果,必须使用合适的时间函数。

Sleep

原理:Sleep函数是使调用Sleep函数的线程休眠,线程主动放弃时间片。当经过指定的时间间隔后,再启动线程,继续执行代码。Sleep函数并不能起到定时的作用,主要作用是延时。在一些多线程中,可能会看到Sleep(0),其主要目的是让出时间片。

精度:Sleep函数的精度非常低,当系统越忙它精度就越低。它的精度取决于线程自身的优先级、其它线程的优先级,以及线程的数量等因素。

MFC的timer事件

原理:timer是一个定时器,可以指定回调函数,默认是Ontimer()函数。

精度:timer事件的精度范围在ms级别,系统越忙其精度越差。

C语言的Time

原理:主要用于获取当前时间。

精度:秒级别。

C语言下的时钟周期clock

原理:clock()是获取计算机启动后的时间间隔。

精度:ms级别,对于短时间内的定时或者延时可以达到ms级别,对于长时间的定时或者延迟的精度还是不够。

Windows下的GetTickCount

原理:GetTickCount()是获取系统启动后的时间间隔。与clock()一样,是向主板BIOS要real time clock时间,会有中断产生,以及延迟问题。

精度:WinowsNT 3.5以及以后版本精度是10ms,它的时间精度比clock要高。

高精度时控函数QueryPerformanceFrequency

原理:CPU上也有一个计数器,以机器人的clock为单位,可以通过rdtsc读取,而不用中断,因此其精度与系统时间相当。

精度:计算机获取硬件支持,精度比较高,可以通过它来判断其它时间函数的精度范围。

#include <windows.h>

class time_watch
{
public:
    time_watch();
	~time_watch();

public:
    void start();
    void stop();
    void restart();
    double elapsed_us();
    double elapsed_ms();
    double elapsed_s();

private:
    LARGE_INTEGER freq_;
    LARGE_INTEGER begin_time_;
    long long elapsed_;
};
time_watch::time_watch()
{
	elapsed_=0;
    QueryPerformanceFrequency(&freq_);
}

time_watch::~time_watch()
{

}

void time_watch::start()
{
    QueryPerformanceCounter(&begin_time_);
}

void time_watch::stop()
{
    LARGE_INTEGER end_time;
    QueryPerformanceCounter(&end_time);
    elapsed_ = (end_time.QuadPart - begin_time_.QuadPart) * 1000000 / freq_.QuadPart;
}

void time_watch::restart()
{
    elapsed_ = 0;
    start();
}

double time_watch::elapsed_us()
{
    return static_cast<double>(elapsed_);
}


double time_watch::elapsed_ms()
{
    return elapsed_ / 1000.0;
}

double time_watch::elapsed_s()
{
    return elapsed_ / 1000000.0;
}

  • 6
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QueryPerformanceFrequency是Windows操作系统提供的一个函数,用于查询计算机硬件的性能计数器的频率。性能计数器是一种硬件或软件机制,用于度量计算机系统的性能,通常用来测量代码的执行时间或者指令的执行次数。 QueryPerformanceFrequency函数可以返回一个大整数值,表示每秒中性能计数器的计数次数。这个值可以用来将性能计数器的计数转换为秒数或者其他时间单位。通过这个函数,我们可以获得一个非常精确的时间单位,以便对系统的性能进行更细致的评估。 在使用QueryPerformanceFrequency函数时,我们通常会结合其他性能计数器相关的函数,如QueryPerformanceCounter函数,来实现对代码的性能评估及优化。首先,我们会使用QueryPerformanceFrequency函数获取性能计数器的频率,然后使用QueryPerformanceCounter函数记录开始和结束的计数值。通过对开始和结束计数值的差值进行计算,我们就可以得到代码的执行时间或者指令的执行次数,从而对代码的性能进行评估和优化。 QueryPerformanceFrequency函数对于一些对性能要求较高的应用场景非常有用,如游戏开发、计算密集型应用等。它可以帮助开发者更加精确地衡量代码的执行时间,从而提高系统的响应速度和效率。 总之,QueryPerformanceFrequency函数是Windows操作系统提供的一个重要函数,用于查询计算机硬件的性能计数器频率。它为开发者提供了一个准确的工具,来评估和优化代码的性能,对于一些对性能要求较高的应用场景非常有帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值