2011-04-02 79 views
7

什么是C++中最好,最准确的定时器?什么是C++中最好,最准确的计时器?

+6

绝对最佳定时器可能是在某个连接到原子钟的嵌入式设备上运行的RTOS上的一些系统特定的调用。那是你在找什么,或者你是否愿意为“最好,最准确的计时器”少一些? – 2011-04-02 04:27:59

+0

@詹姆斯沿着电线行走和待处理的时间等也被纳入考虑范围? (这句话没有任何意义......) – 2011-04-02 04:41:12

+0

另外,这样的高分辨率定时器可能会吃掉CPU。 – 2011-04-02 04:42:00

回答

12

对此的答案是平台特定的。操作系统负责跟踪时序,因此C++语言本身不提供任何语言结构或内置函数。

然而,这里是与平台相关的定时器一些资源:

一个跨平台解决方案可能是boost::asio::deadline_timer

+2

回答与不可笑的基于时间的关键应用程序相关 – Enders 2011-04-02 04:30:56

2

在Windows环境下会QueryPerformanceCounter,但看到,因为你没有指定任何条件下,可能有对司机的C++接口的外部超高分辨率定时器

+0

谢谢,但在Linux/Unix上呢? – 2011-04-02 04:34:21

+0

@Josh:看到我上面的答案。 – 2011-04-02 04:35:07

2

C++标准不说关于时间的一大堆。有一些通过<ctime>标题从C继承的功能。

函数clock是获得亚秒级精度的唯一方式,但精度可能低至一秒(它由宏CLOCKS_PER_SEC定义)。此外,它并不测量实时,而是处理器时间。

函数time测量实时,但(通常)只测量到最近的秒。

要测量亚秒级精度的实时性,您需要一个非标准库。

10

在C++ 11你能够方便到达的最高分辨率计时器:

#include <iostream> 
#include <chrono> 
#include "chrono_io" 

int main() 
{ 
    typedef std::chrono::high_resolution_clock Clock; 
    auto t1 = Clock::now(); 
    auto t2 = Clock::now(); 
    std::cout << t2-t1 << '\n'; 
} 

输出示例:

74 nanoseconds 

“chrono_io” 是一个扩展缓和与I/O问题这些新的类型,并免费提供here

在boost中还有一个<chrono>可用的实现(可能仍然在主干线上,不确定它是否被释放)。

+0

我试着运行now()函数3亿次,大约有100次,t1和t2的延迟/差值大于10微秒。是因为上下文切换还是其他?谢谢 – user1687035 2016-12-12 05:50:12

+0

@ user1687035:上下文切换是一个可能的罪魁祸首。它取决于什么平台,哪种编译器(甚至编译器版本),机器上还有哪些进程等等。通用计算机并不是一个好时钟,除非它不断地询问其他计算机是什么时间。 ;-)在macOS上,我得到了相当可靠的计时*除非*时间机器正在备份,聚光灯正在索引,或邮件正在提取。 – 2016-12-12 14:39:09

相关问题