使用 chrono c++ 与时间进行比较

comparing against time with chrono c++

我想说的差不多就是“只要我们在某个时间以下,就继续迭代”

这个代码看起来像

int time = atoi(argv[1]);
auto start = std::chrono::high_resolution_clock::now(); 
while((std::chrono::duration_cast<chrono::milliseconds>(std::chrono::high_resolution_clock::now() - start).count()) < time){
            /*perform operation*/
  }

但是我无法像这样与时间进行比较并得到错误 error: conversion to ‘double’ from ‘std::chrono::duration<long int, std::ratio<1, 1000> >::rep {aka long int}’ may alter its value [-Werror=conversion]

有谁知道如何使用 chrono 与小于运算符进行比较?

错误在优先级,你的转换是在count()函数之后执行的,这导致转换超过了double值。

问题可以这样解决:

int time = atoi(argv[1]);
auto start = std::chrono::high_resolution_clock::now(); 
while(((std::chrono::duration_cast<chrono::milliseconds>(std::chrono::high_resolution_clock::now() - start)).count()) < time){
            /*perform operation*/
  }
int time = atoi(argv[1]);

time是什么单位? secondsnanoseconds?对于这个答案,我假设 seconds,但将其更改为您需要的任何内容:

std::chrono::seconds time{atoi(arv[1])};

下一个:

auto start = std::chrono::high_resolution_clock::now();

high_resolution_clock 将成为 system_clocksteady_clock 的类型别名。 我建议根据您的需要选择system_clocksteady_clock,而不是让供应商为您选择。

while((std::chrono::duration_cast<chrono::milliseconds>(std::chrono::high_resolution_clock::now() - start).count()) < time){
            /*perform operation*/
  }
  • 始终尝试留在计时类型系统中,而不是使用 .count() 退出它。一旦退出 chrono 库,它就无法再帮助你。在这种情况下,这意味着使用计时单位而不是 ints.

    进行比较
  • 比较计时单位时,不需要强制转换,比较的双方都是相同的单位。例如比较 secondsmilliseconds 就可以了。考虑到不同的单位,chrono 会正确地进行比较。

我想发布 function-scope using namespace std::chrono,因为我发现重复 std::chrono:: 过于冗长,使代码更难阅读。

using namespace std::chrono;
seconds time{atoi(arv[1])};
auto start = steady_clock::now();
while(steady_clock::now() - start < time)
{
     // perform operation
}

或者你可以用代数重新排列这个:

while(steady_clock::now() < start + time)
{
     // perform operation
}

注意到 rhs 上的“常量”,您可以收集并重命名它:

auto finish = steady_clock::now() + seconds{atoi(arv[1])};
while(steady_clock::now() < finish)
{
     // perform operation
}

以上都是等价的,所以你可以选择你觉得更易读的那个。