2013-08-02 79 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()); 
相关问题