以特定方式获取计时时间
getting chrono time in specific way
我有以下 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 位 "something",可能 micro/nanoseconds 组合成单个 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 位是 "valid" 时间戳。
秒 32 位 "part" 可以是任何东西 - 纳秒或微秒 - 只要此函数的两次连续调用给我不同的秒 "part".
一切都很好
C++11 chrono 类型仅使用一个数字来表示自给定纪元以来的时间,这与使用两个数字精确表示时间的 timeval
(或 timespec
)结构不同.因此,对于 C++11 chrono,您不需要 combine()
方法。
now()
返回的时间戳内容取决于你使用的时钟;有树钟,在http://en.cppreference.com/w/cpp/chrono中有描述:
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
i want seconds in one int, milliseconds in another.
这是执行此操作的代码:
#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
我有以下 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 位 "something",可能 micro/nanoseconds 组合成单个 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 位是 "valid" 时间戳。
秒 32 位 "part" 可以是任何东西 - 纳秒或微秒 - 只要此函数的两次连续调用给我不同的秒 "part".
一切都很好C++11 chrono 类型仅使用一个数字来表示自给定纪元以来的时间,这与使用两个数字精确表示时间的 timeval
(或 timespec
)结构不同.因此,对于 C++11 chrono,您不需要 combine()
方法。
now()
返回的时间戳内容取决于你使用的时钟;有树钟,在http://en.cppreference.com/w/cpp/chrono中有描述:
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
i want seconds in one int, milliseconds in another.
这是执行此操作的代码:
#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