2011-04-02 77 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

相關問題