2013-08-02 119 views
10

我希望能夠通過計時庫獲得納秒精度,但我無法弄清楚如何將std::chrono::high_resolution_clock::now()轉換爲long int。我嘗試這樣做:將高分辨率時鐘時間轉換爲整數(Chrono)

#include <chrono> 
#include <iostream> 
using namespace std; 

int main() { 
    typedef std::chrono::high_resolution_clock Clock; 

    long int val = Clock::now(); 

    cout << val << endl; 

    cin.ignore(); 
    return 0; 
} 

但是,這給我的錯誤:error C2440: 'initializing' : cannot convert from 'std::chrono::system_clock::time_point' to 'long' 我怎樣才能將其轉換爲一個64位的整型?如果我不能,那麼我不會看到chrono是如何有用的。

+2

如果你讀了[文件](http://en.cppreference.com/w/cpp/chrono/system_clock/now),你會看到「now」函數返回['time_point'](http://en.cppreference.com/w/cpp/chrono/time_point)對象(就像錯誤消息所示)。有關如何打印時間的示例,請參閱'time_point'鏈接。如果你想要幾秒鐘的時間,可以使用例如['to_time_t'](http://en.cppreference.com/w/cpp/chrono/system_clock/to_time_t)。 –

+0

'的優點之一是它是安全的;兩個例子是時間點和持續時間是截然不同的,不可互換的類型和類型跟蹤單位爲你,所以你不能混淆秒爲毫秒等 – bames53

回答

13

與GCC 4.8 Linux上的以下工作:

using namespace std::chrono; 
auto now = high_resolution_clock::now(); 
auto nanos = duration_cast<nanoseconds>(now.time_since_epoch()).count(); 
std::cout << nanos << '\n'; 
+1

這打印出一個巨大的負數。 –

+0

@SusanYanders我不認爲計數可以返回一個負數 – aaronman

+3

@aaronman那麼它做了 –

3

首先,轉換時間點now()返回進入自已知時間點以來的持續時間。這可以是時鐘的時代:

auto since_epoch = Clock::now().time_since_epoch(); 

或者你已經選擇了一些時間點:

auto since_epoch = Clock::now() - my_epoch; 

然後你就可以通過轉換並提取計數得到納秒數

auto nanos = duration_cast<nanoseconds>(since_epoch).count(); 

或除以任何你想要的粒度:

auto nanos = since_epoch/nanoseconds(1); 

正如評論中指出的那樣,如果您真的需要標量數量,只做最後一次轉換(離開Chrono庫的類型系統,丟失有關數字含義的有價值信息);也許是因爲你正在與不使用標準類型的API進行交互。對於你自己的計算,這些類型應該允許你執行任何你需要的有意義的算術。

+1

'auto nanos = since_epoch/nanoseconds(1);'應該指出的是,這導致無標量標量。除非你真的需要無單位的值,否則最好堅持使用計時器的單位安全型。 – bames53

+0

@ bames53:確實;但在這種情況下,一個無單位的標量正是OP所要求的,確切地說'count()'也給了你什麼。 –

+0

當然,新用戶應該被告知在「」和顯示的慣用的「」使用情況下強打字的好處。新用戶通常會要求較弱的類型,因爲這是他們在其他時間庫中習慣的,而不是因爲他們實際上需要弱類型。 – bames53

0

更簡潔nosid的回答版本:

long int time = static_cast<long int>(std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::high_resolution_clock::now().time_since_epoch()).count()); 
相關問題