std::chrono::system_clock::time_since_epoch().count() 以微秒為單位給出結果。
我想要以納秒為單位的當前時間。但是我不能使用 high_resolution_clock 因為在我的系統上它是 stable_clock (單調時鐘)的別名。
我知道我的系統具有納秒能力,因為如果我使用 clock_gettime(CLOCK_REALTIME, &ts) 我得到正確的納秒解析度紀元時間。
如何告訴 std::chrono 使用納秒解析度?我想避免使用clock_gettime 并堅持使用cpp 包裝器。
uj5u.com熱心網友回復:
如何告訴 std::chrono 使用納秒解析度?
這聽起來很適合撰寫您自己的自定義時鐘。這比聽起來容易得多:
#include <time.h>
#include <chrono>
struct my_clock
{
using duration = std::chrono::nanoseconds;
using rep = duration::rep;
using period = duration::period;
using time_point = std::chrono::time_point<my_clock>;
static constexpr bool is_steady = false;
static time_point now()
{
timespec ts;
if (clock_gettime(CLOCK_REALTIME, &ts))
throw 1;
using sec = std::chrono::seconds;
return time_point{sec{ts.tv_sec} duration{ts.tv_sec}};
}
};
只要有你的now()電話clock_gettime用CLOCK_REALTIME。然后chrono::time_point用nanoseconds解析度打包退貨。
警告,我剛剛在 macOS 上嘗試過這個,并now()連續呼叫了兩次。它每次列印出相同的納秒數。并且無法在納秒內執行呼叫。所以我得到了納秒精度,但不是納秒精度。
如果您想my_clock參與 C 20std::chrono::clock_cast設施(正如 Nicol Bolas 在下面的評論中所建議的那樣),請將這兩個靜態成員函式添加到my_clock:
template<typename Duration>
static
std::chrono::time_point<std::chrono::system_clock, Duration>
to_sys(const std::chrono::time_point<my_clock, Duration>& tp)
{
return std::chrono::time_point<std::chrono::system_clock, Duration>
{tp.time_since_epoch()};
}
template<typename Duration>
static
std::chrono::time_point<my_clock, Duration>
from_sys(const std::chrono::time_point<std::chrono::system_clock, Duration>& tp)
{
return std::chrono::time_point<my_clock, Duration>{tp.time_since_epoch()};
}
現在你可以這樣說:
cout << clock_cast<system_clock>(my_clock::now()) << '\n';
您還可以clock_cast往返于參與該設施的所有其他 C 20 和自定義時鐘clock_cast。
uj5u.com熱心網友回復:
我得到了正確的納秒解析度紀元時間。
你是?clock_gettime被要求回傳在納秒的時間,不管你是什么訪問時鐘。這并不意味著CLOCK_REALTIME實際上提供了這種解析度。它可能在內部只有微秒解析度,并通過乘以 1000 來表示納秒。
相比之下,計時時鐘的實際解析度由實作指定。它不是 UI 的強制部分;它可能因系統和時鐘而異。因此,如果特定實作的單位system_clock::period為微秒,那么這就是該實作愿意聲稱提供的所有解析度。
也許實作可以提供更多的解決方案,但如果可以,它可能會這樣說。因此,如果沒有,那么這意味著實作聲稱提供更多解決方案并不舒服。
但是,如果您覺得這clock_gettime確實提供了更好的解析度(而不是簡單地提供更多數字),則可以使用它。在 C 20 中,system_clock明確是 UNIX 時間。因此,如果您有時間以納秒為單位,您可以將其轉換為time_point<system_clock, nanoseconds>:
namespace chrono = std::chrono;
...
using nano_sys = chrono::time_point<chrono::system_clock, chrono::nanoseconds>;
auto sys_tp_ns = nano_sys(chrono::nanoseconds(time_in_nanoseconds));
uj5u.com熱心網友回復:
首先,請注意,在 GCC libstc 上,std::chrono 只是圍繞 clock_gettime() 的語法糖的薄包裝。你在這里談論同樣的事情。std::chrono 使用clock_gettime()。
system_clock::time_point
system_clock::now() noexcept
{
timespec tp;
clock_gettime(CLOCK_REALTIME, &tp);
return time_point(duration(chrono::seconds(tp.tv_sec)
chrono::nanoseconds(tp.tv_nsec)));
}
來源:https : //code.woboq.org/gcc/libstdc -v3/src/c 11/chrono.cc.html
(以上代碼已清理)
所以精度就在那里,你只需要在納秒內檢索它
uint64_t utc_now_nanos() {
std::chrono::steady_clock::time_point tp = std::chrono::steady_clock::now();
return std::chrono::time_point_cast<std::chrono::nanoseconds>(tp).time_since_epoch().count();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/392255.html
