标签: c++-chrono

Chrono - 两个时间点之间的差异,以毫秒为单位?

我怎样才能(使用std :: chrono库)得到两个时间点之间的差异,以毫秒为单位?

我可以用这个来做到这一点:

std::chrono::time_point<std::chrono::system_clock> now = std::chrono::system_clock::now();

std::chrono::time_point<std::chrono::system_clock> foo = now + std::chrono::milliseconds(100);

std::chrono::duration<float> difference = foo - now;

const int milliseconds = difference.count() * 1000;
Run Code Online (Sandbox Code Playgroud)

我怎样才能在毫秒内得到这个时间,所以我可以将持续时间用作unsigned int,而不是float,然后乘以1000?

c++ time c++11 c++-chrono

15
推荐指数
3
解决办法
3万
查看次数

std :: chrono :: high_resolution_clock的用途是什么?

起初我认为它可以用于性能测量.但它std::chrono::high_resolution_clock可能是不稳定(is_steady可能false).据说std::chrono::high_resolution_clock甚至可能是别名std::chrono::system_clock通常不稳定.所以我无法用这种类型的时钟来测量时间间隔,因为在任何时刻都可以调整时钟并且我的测量结果是错误的.

同时我无法将时间点转换std::chrono::high_resolution_clock为日历时间,因为它没有to_time_t方法.所以我也无法用这种类型的时钟获得实时.

那可以std::chrono::high_resolution_clock用什么呢?

c++ time clock c++11 c++-chrono

15
推荐指数
1
解决办法
1527
查看次数

为什么 std::sleep_for(std::chrono::hours::max()) 在 Linux 上立即返回?

我正在运行一个提供服务的 C++ 程序,并注意到即使不提供任何请求,它也会占用 100% 的 CPU。我将问题缩小到一个 while 循环,该循环调用std::sleep_for以防止服务退出。

为了测试,我编译并运行了这个简单的测试程序:

#include <chrono>
#include <thread>

int main(int argc, char * argv[])
{
    std::this_thread::sleep_for(std::chrono::hours::max());
}
Run Code Online (Sandbox Code Playgroud)

我的预期是它会休眠很长时间,事实上,当我在 M1 Mac 上尝试它时,我看到了预期的行为。然而,当我在 Redhat Linux 8 机器上运行它时,它立即返回。我还在 Mac 上运行的 Rocky Linux 8 docker 容器上进行了尝试,这也立即返回。这证实了这种情况通常发生在 RHEL 8 系统上 - 或者至少在 gcc 8.5.0 上发生,因为两个 Linux 系统上的编译器版本是相同的(Mac 上的编译器是 Apple 提供的 clang)。

这解释了为什么我的服务占用了 100% 的 CPU,因为它是在 while 循环中调用的。但我从未听说过这种行为。还有其他人吗?

当然,我可以通过睡一会儿来轻松解决问题std::chrono::seconds(1)。我只是出于求知欲才问这个问题。

c++ linux multithreading compiler-bug c++-chrono

15
推荐指数
1
解决办法
309
查看次数

持久化std :: chrono time_point实例

持久化std :: chrono time_point实例然后将它们读回另一个相同类型的实例的正确方法是什么?

   typedef std::chrono::time_point<std::chrono::high_resolution_clock> time_point_t;

   time_point_t tp = std::chrono::high_resolution_clock::now();
   serializer.write(tp);
   .
   .
   .
   time_point_t another_tp;
   serializer.read(another_tp);
Run Code Online (Sandbox Code Playgroud)

对write/read的调用,假设time_point_t类型的实例可以某种方式转换为字节表示,然后可以将其写入磁盘或套接字等或从磁盘或套接字读取.

Alf建议的可能解决方案如下:

   std::chrono::high_resolution_clock::time_point t0 = std::chrono::high_resolution_clock::now();

   //Generate POD to write to disk
   unsigned long long ns0 = t0.time_since_epoch().count();

   //Read POD from disk and attempt to instantiate time_point
   std::chrono::high_resolution_clock::duration d(ns0)

   std::chrono::high_resolution_clock::time_point t1(d);

   unsigned long long ns1 = t1.time_since_epoch().count();

   if ((t0 != t1) || (ns0 != ns1))
   {
      std::cout << "Error time points don't match!\n";
   }
Run Code Online (Sandbox Code Playgroud)

注意:上面的代码有一个错误,因为最终实例化的时间点与原始时间点不匹配.

在旧样式time_t的情况下,人们通常只是根据其sizeof将整个实体写入磁盘,然后以相同的方式读取它 - 简而言之,新的std :: chrono类型的等价物是什么?

c++ serialization persistence c++11 c++-chrono

14
推荐指数
2
解决办法
3963
查看次数

在C++ 11/14中处理Julian日期

在C++中处理Julian日期的最佳/最简单方法是什么?我希望能够在朱利安日期和格里高利日期之间进行转换.我有C++ 11和C++ 14.罐<chrono>库有助于解决这个问题?

c++ julian-date c++-chrono c++14

14
推荐指数
1
解决办法
4072
查看次数

std::chrono::years 存储真的至少是 17 位吗?

来自cppreference

std::chrono::years (since C++20) duration</*signed integer type of at least 17 bits*/, std::ratio<31556952>>

使用libc++,似乎std::chrono::yearsis的下划线存储是short有符号的16 位

std::chrono::years( 30797 )        // yields  32767/01/01
std::chrono::years( 30797 ) + 365d // yields -32768/01/01 apparently UB
Run Code Online (Sandbox Code Playgroud)

cppreference或其他任何内容是否有错别字?

例子:

#include <fmt/format.h>
#include <chrono>

template <>
struct fmt::formatter<std::chrono::year_month_day> {
  char presentation = 'F';

  constexpr auto parse(format_parse_context& ctx) {
    auto it = ctx.begin(), end = ctx.end();
    if (it != end && *it == 'F') presentation = *it++;

# …
Run Code Online (Sandbox Code Playgroud)

c++ libc++ c++-chrono c++20

14
推荐指数
1
解决办法
590
查看次数

C++ 20 chrono:如何将 time_point 与 month_day 进行比较?

是否有一个现代和优雅的方式来确定time_point可变匹配给定的month_day变量?

例如,我想知道今天是否是圣诞节。我有以下代码:

#include <chrono>

bool IsTodayChristmas()
{
    using namespace std::chrono;

    constexpr month_day Christmas = {December / 25};
    auto Now = system_clock::now();

    // return Now == Christmas; // How to?
}
Run Code Online (Sandbox Code Playgroud)

现代而优雅:我的意思是如果可能的话,我宁愿不使用旧的 C 类型(类似于std::time_tstd::tm)和字符串比较(类似于std::put_time)。

任何帮助,将不胜感激。

c++ date c++-chrono c++20

14
推荐指数
1
解决办法
778
查看次数

在<chrono>中将monotonic_clock重命名为steady_clock的理由是什么?

为什么委员会将monotonic_clock重命名为stable_clock?供应商提供monotonic_clock以实现向后兼容性,因此我预计monotonic_clock将会停留一段时间.

在C++ 0x中弃用某些东西似乎有点早.;)编辑:委托人有权利和责任在发布之前尽可能地重命名组件,就像在这种情况下一样.

我没有看到重命名的好处.

c++ c++11 c++-chrono

13
推荐指数
1
解决办法
2514
查看次数

从chrono :: duration中获取unsigned int毫秒

对于winapi包装器,我想在给出呼叫的持续时间内使用计时器.代码示例:

bool setTimer(std::chrono::duration<std::chrono::milliseconds> duration)
{
    unsigned int dwDuration = Do some chrono magic here

    SetTimer(m_hWnd,1,dwDuration,0);
}
Run Code Online (Sandbox Code Playgroud)

dwDuration必须以毫秒为单位.

第一个问题:如何做到魔术.

第二个问题:参数声明好吗?

c++11 c++-chrono

13
推荐指数
2
解决办法
2万
查看次数

Android NDK计时时代不正确(std :: chrono :: high_resolution_clock)

下面的代码不打印纪元.

typedef std::chrono::high_resolution_clock Clock;
typedef std::chrono::milliseconds Milliseconds;
auto res = std::chrono::duration_cast<Milliseconds>(Clock::now().time_since_epoch()).count();
std::stringstream ss;
ss << res;
printf(">>>>>>>>>>> TimeUtiles::getTimestamp %s", ss.str().c_str());
Run Code Online (Sandbox Code Playgroud)

我使用NDK r9d并选择了NDK工具链版本为4.8!

编辑:

std::chrono::high_resolution_clockstd::chrono::system_clock和它的工作.为什么?

c++ android android-ndk c++-chrono

12
推荐指数
1
解决办法
742
查看次数