C++ 以特定方式获取计时时间

C++ 以特定方式获取计时时间,c++,c++11,chrono,system-clock,gettimeofday,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

我有以下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);
}
uint64联合收割机(uint32常数秒,uint32常数usec){

return(uint64_t)secC++11 chrono类型仅使用一个数字来表示自给定纪元以来的时间,这与
timeval
(或
timespec
)结构不同,后者使用两个数字来精确表示时间。因此,使用C++11 chrono时,不需要使用
combine()
方法

now()
返回的时间戳的内容取决于您使用的时钟;有树时钟,如中所述:

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

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;
}

我想要一个整数中的秒,另一个整数中的毫秒

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

#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';
}

这是用于memcached缓存过期之类的东西,但我需要它的格式类似于C
gettimeofday
中的格式。例如,第一部分32位时间戳,第二部分-无论什么,只要更改频率超过1秒。我可以得到32位时间戳,但我不知道如何收集“秒”部分使用chrono。您所做的是从1970-01-01 UTC获得纳秒数,并将其存储在
uint64\u t
中。如果这是您想要的,您就做对了。
duration\u cast
可以简化为
纳秒{tse}
,但这不会改变结果。我希望在一个整数中有秒,在另一个整数中有毫秒。我想我找到了方法,但明天会更新它。我最终从毫秒更改为微秒,因为似乎
gettimeofday
毕竟给了微秒。
#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
#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