2017-06-29 77 views
1

我需要計算Linux(Ubuntu 14)上的時間差(以毫秒爲單位)。如何獲得獨立於系統時間的時間差異(毫秒)?

它需要獨立於系統時間,因爲應用程序可能會在執行期間更改它(它會根據從GPS接收的數據設置系統時間)。

我檢查了clock函數,它不適用於我們,因爲它返回程序消耗的處理器時間,我們需要實時。

sysinfo(如在此question中所述)會在啓動後返回秒數,並且我們還需要幾毫秒。

根據我們的測試(考慮到我們需要毫秒,並且此函數被重複調用),從/ proc/uptime(在此question中提到)讀取似乎很慢。

我們可以使用C++ 11,但我認爲std :: chrono也與系統時間有關(如果我錯了,請糾正我)。

有沒有其他的方法來完成這個?


我們的性能測試(用於的/ proc /運行時間比較),重複調用100萬:

gettimeofday的:

(不是我們需要的,因爲它依賴於系統時間)

#include <sys/time.h> 

unsigned int GetMs(){ 
    unsigned int ret = 0; 
    timeval ts; 
    gettimeofday(&ts,0); 
    static long long inici = 0; 
    if (inici==0){ 
     inici = ts.tv_sec; 
    } 
    ts.tv_sec -= inici; 
    ret = (ts.tv_sec*1000 + (ts.tv_usec/1000)); 
    return ret; 
} 

時鐘:

(無效,返回應用程序使用的蜱,非實時)

#include <time.h> 
unsigned int GetMs(){ 
    unsigned int ret = 0; 
    clock_t t; 
    t = clock(); 
    ret = t/1000; 
    return ret; 
} 

正常運行時間:

#include <fstream> 
unsigned int GetMs(){ 
    unsigned int ret = 0; 
    double uptime_seconds; 
    if (std::ifstream("/proc/uptime", std::ios::in) >> uptime_seconds) { 
     ret = (int) (1000 * uptime_seconds); 
    } 
} 

結果:

  • gettimeofday的:31毫秒
  • 時鐘:153毫秒
  • 正常運行時間:6005毫秒

回答

3

低層系統原始,你想要做什麼是clock_gettimeCLOCK_MONOTONIC「clockid」。

CLOCK_MONOTONIC:時鐘不能被集合並且表示,因爲一些不確定的起點單調時間。此時鐘不受系統時間內不連續跳轉的影響(例如系統管理員手動更改時鐘),但會受到由adjtime(3)和NTP執行的增量調整的影響。

(即「受受的adjtime進行增量調整(3)和NTP」幾乎可以肯定,你想要的東西。)

此功能在<time.h>聲明,並與GNU libc中的當前版本,可以默認訪問。對於舊版本,您可能需要將_POSIX_C_SOURCE定義爲大於或等於200809L的值,然後才包括任何系統標題(不僅在包括time.h之前),並且您可能還需要將程序與-lrt關聯。

clock_gettime返回struct timespec,它可以表示單納秒的差異;實際精度通常稍低一些,但是您應該能夠依靠毫秒級精度進行計算,尤其是在「訓練」系統時鐘的程序(例如ntpd)正在運行時。

7

你想要的是std::chrono::steady_clock

std::chrono::steady_clock表示單調時鐘。這個時鐘的時間點不能隨着物理時間的推移而減少。此時鐘與掛鐘時間無關(例如,可能是自上次重新啓動以來的時間),並且最適合測量間隔。

如果您需要支持C++ 98/03環境中,你也可以使用boost:steady_clock

+0

感謝您的回答。它完美地工作,並不依賴於系統時鐘,這符合我的要求。然而,根據我的測試,我接受@ zwol的答案是更快。在我的嵌入式設備上,有1000000次重複調用,std :: chrono :: steady_clock花了3523 ms,clock_gettime和CLOCK_MONOTONIC花了2184 ms。 –

+0

@PauGuillamon沒問題。樂意效勞。 – NathanOliver