以特定的方式获得计时时间

时间:2015-11-09 16:27:59

标签: c++ c++11 chrono system-clock gettimeofday

我有以下C代码:

uint64_t combine(uint32_t const sec, uint32_t const usec){
    return (uint64_t) sec << 32 | usec;
};

uint64_t now3(){
    struct timeval tv;

    gettimeofday(&tv, NULL);

    return combine((uint32_t) tv.tv_sec, (uint32_t) tv.tv_usec);
}

它将32位时间戳和32位“某事”组合在一起,可能是微/纳秒到单个64位整数。

我真的很难用C ++ 11 chrono重写它。

这是我到目前为止所做的,但我认为这是错误的做法。

auto tse = std::chrono::system_clock::now().time_since_epoch();
auto dur = std::chrono::duration_cast<std::chrono::nanoseconds>( tse ).count();
uint64_t time = static_cast<uint64_t>( dur );

重要提示 - 我只关心前32位为“有效”时间戳。

第二个32位“部分”可以是任何东西 - 纳米或微秒 - 一切都很好,只要这个函数的两个连续调用给我不同的第二个“部分”。

2 个答案:

答案 0 :(得分:1)

C ++ 11计时类型仅使用一个数字来表示自给定时期以来的时间,而timeval(或timespec)结构使用两个数字来精确表示时间。因此,使用C ++ 11 chrono,您不需要combine()方法。

now()返回的时间戳内容取决于您使用的时钟;有{@ 3}}中描述的树时钟:

system_clock             wall clock time from the system-wide realtime clock
steady_clock             monotonic clock that will never be adjusted
high_resolution_clock    the clock with the shortest tick period available

如果您希望连续的时间戳始终不同,请使用稳定时钟:

auto t1 = std::chrono::steady_clock::now();
...
auto t2 = std::chrono::steady_clock::now();
assert (t2 > t1);

修改:回复评论

#include <iostream>
#include <chrono>
#include <cstdint>

int main()
{
    typedef std::chrono::duration< uint32_t, std::ratio<1> > s32_t;
    typedef std::chrono::duration< uint32_t, std::milli > ms32_t;

    s32_t  first_part;
    ms32_t second_part;

    auto t1 = std::chrono::nanoseconds( 2500000000 ); // 2.5 secs

    first_part  = std::chrono::duration_cast<s32_t>(t1);
    second_part = std::chrono::duration_cast<ms32_t>(t1-first_part);

    std::cout << "first part   = " << first_part.count() << " s\n"
              << "seconds part = " << second_part.count() << " ms" << std::endl;

    auto t2 = std::chrono::nanoseconds( 2800000000 ); // 2.8 secs

    first_part  = std::chrono::duration_cast<s32_t>(t2);
    second_part = std::chrono::duration_cast<ms32_t>(t2-first_part);

    std::cout << "first part   = " << first_part.count() << " s\n"
              << "seconds part = " << second_part.count() << " ms" << std::endl;
}

输出:

first part   = 2 s
seconds part = 500 ms
first part   = 2 s
seconds part = 800 ms

答案 1 :(得分:1)

  

我希望在一个int中使用秒,在另一个int中使用毫秒。

以下是执行此操作的代码:

#include <chrono>
#include <iostream>

int
main()
{
    auto now = std::chrono::system_clock::now().time_since_epoch();
    std::cout << now.count() << '\n';
    auto s = std::chrono::duration_cast<std::chrono::seconds>(now);
    now -= s;
    auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(now);
    int si = s.count();
    int msi = ms.count();
    std::cout << si << '\n';
    std::cout << msi << '\n';
}

这只是我的输出:

1447109182307707
1447109182
307