在特定秒数后停止循环的有效方法

Efficient way to stop a loop after specific number of seconds

本文关键字:循环 有效 方法      更新时间:2023-10-16

我在C++中有一个循环,我想运行几秒钟。尽管每次迭代的工作量不同,从几微秒到几秒钟,但在迭代之间停止是可以的。它是高性能代码,所以我想避免在每次迭代时计算时差:

while (!status.has_value())
{
  // do something
  // this adds extra delays that I would like to avoid
  if (duration_cast<seconds>(system_clock::now() - started).count() >= limit)
    status = CompletedBy::duration;
}

我在想的是,也许有一种方法可以调度信号,然后在发生时停止循环,而不是检查每次迭代的时间差。

顺便说一句,循环可能会在信号之前退出。

我做过类似的事情,但是在Java中。一般的想法是使用单独的线程来管理哨兵值,使您的循环看起来像......

okayToLoop = true;
// code to launch thread that will wait N milliseconds, and then negate okayToLoop
while((!status.hasValue()) AND (okayToLoop)) {
    // loop code
}

"警告"是线程的许多 sleep(( 函数都使用"至少睡眠"语义,因此,如果休眠 N 毫秒真的很重要,则需要在线程实现中解决这个问题。但是,这样可以避免不断检查循环每次迭代的持续时间。

请注意,这也将允许循环的当前迭代在检查哨兵值之前完成。我还实现了这种方法,其中"控制线程"实际上中断了正在执行循环的线程,从而中断了迭代。当我这样做时,我实际上已经将循环放入工作线程中。

任何形式的线程间通信都将比对高性能时钟的简单查询慢得多。

现在,steady_clock::now()在循环中可能太慢了。

使用特定于操作系统的 API,绑定线程以对特定 CPU 具有荒谬的优先级和关联性。 或者在考虑到所有可能出错的地方之后,使用 rdtsc。 计算如果 (a( 出现问题或 (b( 您已超过时间阈值,您期望获得的值。

发生这种情况时,请检查steady_clock::now(),看看您是否足够接近完成,如果是,请完成。 如果没有,请计算新的高性能时钟目标并再次循环。