【问题标题】:comparing against time with chrono c++用chrono c ++与时间比较
【发布时间】:2020-09-22 04:24:55
【问题描述】:

我几乎想说“只要我们在一定时间内,继续迭代”

这个代码看起来像

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&lt;long int, std::ratio&lt;1, 1000&gt; &gt;::rep {aka long int}’ may alter its value [-Werror=conversion]

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

【问题讨论】:

标签: c++ chrono


【解决方案1】:
int time = atoi(argv[1]);

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

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

下一步:

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

high_resolution_clock 将成为system_clock 或steady_clock 的类型别名。 The top of this answer explains the difference. 我建议根据您的需要选择system_clock 或steady_clock,而不是让供应商为您选择。

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

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

我喜欢发出函数范围 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
}

以上所有内容都是等效的,因此您可以选择您认为更具可读性的任何一个。

【讨论】:

    【解决方案2】:

    错误在优先,你在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*/
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-01
      • 2023-04-02
      • 2020-04-02
      • 2021-08-19
      • 2013-11-12
      • 2017-01-02
      • 1970-01-01
      相关资源
      最近更新 更多