一杯清酒邀明月
天下本无事,庸人扰之而烦耳。

介绍

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

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读取,而不用中断,因此其精度与系统时间相当。

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

 1 #include <windows.h>
 2  
 3 class time_watch
 4 {
 5 public:
 6     time_watch();
 7     ~time_watch();
 8  
 9 public:
10     void start();
11     void stop();
12     void restart();
13     double elapsed_us();
14     double elapsed_ms();
15     double elapsed_s();
16  
17 private:
18     LARGE_INTEGER freq_;
19     LARGE_INTEGER begin_time_;
20     long long elapsed_;
21 };
 1 time_watch::time_watch()
 2 {
 3     elapsed_=0;
 4     QueryPerformanceFrequency(&freq_);
 5 }
 6  
 7 time_watch::~time_watch()
 8 {
 9  
10 }
11  
12 void time_watch::start()
13 {
14     QueryPerformanceCounter(&begin_time_);
15 }
16  
17 void time_watch::stop()
18 {
19     LARGE_INTEGER end_time;
20     QueryPerformanceCounter(&end_time);
21     elapsed_ = (end_time.QuadPart - begin_time_.QuadPart) * 1000000 / freq_.QuadPart;
22 }
23  
24 void time_watch::restart()
25 {
26     elapsed_ = 0;
27     start();
28 }
29  
30 double time_watch::elapsed_us()
31 {
32     return static_cast<double>(elapsed_);
33 }
34  
35  
36 double time_watch::elapsed_ms()
37 {
38     return elapsed_ / 1000.0;
39 }
40  
41 double time_watch::elapsed_s()
42 {
43     return elapsed_ / 1000000.0;
44 }

 

posted on 2022-07-19 13:48  一杯清酒邀明月  阅读(322)  评论(0编辑  收藏  举报