【问题标题】:How to run a loop for a specified amount of time如何在指定的时间内运行循环
【发布时间】:2019-11-15 12:49:01
【问题描述】:

我想在指定的时间内运行一段代码。这似乎不起作用。为什么?

int sec = 5;
auto start = std::chrono::steady_clock::now();
while (std::chrono::duration<double, std::milli>(
          start - std::chrono::steady_clock::now()
       ).count() < sec * 1000)
{
    // do stuff
};

【问题讨论】:

  • 循环似乎没有终止。
  • 运行时间超过 5 秒。
  • now 晚于start。请检查您的减法
  • 好吧,也许有人会觉得这很有帮助。我找到了答案,所以我很高兴。
  • @uneven_mark:虽然这个问题是微不足道的,但它不是题外话。很多时候,我们在人们的代码中发现的错误并不是他们特定领域考虑的核心,而是更简单和愚蠢的东西。

标签: c++ time chrono


【解决方案1】:

您的具体问题

您的问题似乎是反向减法:循环执行持续时间是now() - start,而不是start - now()

顺便提一点代码美化供你考虑:

#include <chrono>

int main() {
    auto now = std::chrono::steady_clock::now;
    using namespace std::chrono_literals;
    auto work_duration = 5s;
    auto start = now();
    while ( (now() - start) < work_duration)
    {
        // do stuff
    };
}

(还有这个compiles - 这是你应该确保你的问题中的代码发生的事情......)

概括

让我们更进一步,为您创建一个通用函数来运行某项持续时间:

#include <chrono>

template <typename F, typename Duration>
void timed_repeat(F f, Duration execution_duration)
{
    auto now = std::chrono::steady_clock::now;
    auto stop_time = now() + execution_duration;
    while (now() < stop_time) { f(); };
}

int main() {
    auto work_duration = std::chrono::seconds{5};
    auto foo = []() {
        // whatever 
    };
    timed_repeat(foo, work_duration);
}

重要提示:请记住,工作持续时间是“总”而不是“净”,即如果您的进程被其他进程抢占,或者只是在 I/O 上休眠,这仍然计入运行//whatever 部分所花费的时间。对于您的原始代码 sn-p 和我的代码都是如此。

【讨论】:

  • 嗯,现在我觉得自己很聪明 :D 完全有道理。抱歉打扰
猜你喜欢
  • 1970-01-01
  • 2018-08-19
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多