gpt4 book ai didi

c++ - 为什么 chrono::system_clock 返回微秒而 clock_gettime 返回纳秒

转载 作者:行者123 更新时间:2023-12-05 08:46:07 26 4
gpt4 key购买 nike

std::chrono::system_clock::time_since_epoch().count() 以微秒为单位给出结果。

我想要以纳秒为单位的当前时间。但我不能使用 high_resolution_clock,因为在我的系统上它是 steady_clock(单调时钟)的别名。

我知道我的系统支持纳秒级,因为如果我使用 clock_gettime(CLOCK_REALTIME, &ts),我将获得正确的纳秒级分辨率纪元时间。

如何告诉 std::chrono 使用纳秒分辨率?我想避免使用 clock_gettime 并坚持使用 cpp 包装器。

最佳答案

How can I tell std::chrono to use the nanosecond resolution?

这听起来很适合编写您自己的自定义时钟。这比听起来容易得多:

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

只需让您的 now() 使用 CLOCK_REALTIME 调用 clock_gettime。然后将返回值打包到 chrono::time_point 中,分辨率为 nanoseconds

警告,我刚刚在 macOS 上尝试了这个并连续调用了两次 now()。它每次都打印出相同的纳秒数。而且调用不可能在纳秒内执行。所以我得到的是纳秒精度,但不是纳秒精度。

如果您希望 my_clock 参与 C++20 std::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所有 其他参与clock_cast 设施的C++20 和自定义时钟。

关于c++ - 为什么 chrono::system_clock 返回微秒而 clock_gettime 返回纳秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70475588/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com