在特定秒数后停止循环的有效方法
Efficient way to stop a loop after specific number of seconds
我在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()
,看看您是否足够接近完成,如果是,请完成。 如果没有,请计算新的高性能时钟目标并再次循环。
相关文章:
- 在循环条件 i<sqrtN(预先计算)和 i*i<N 中,C++哪个更有效?
- 是否必须使用无限循环来有效地重用协程句柄?
- 如何避免使用 goto 并有效地中断嵌套循环
- 用于在程序结束后暂停程序的有效循环
- 而循环比循环更有效.可能是什么原因
- 循环try..catch ..确保输入有效或使用控制语句
- 可能以有效的方式在模拟的循环中进行多线程
- 使用for循环制作位图的最简单和最有效的方法
- 在特定秒数后停止循环的有效方法
- 我如何让我的部分代码循环并重复一个问题,直到答案是有效的输入C++
- 为什么这个逻辑在我的主循环上有效,但在方法上不起作用
- 编写一个循环,以检查变量的值与大量可能的有效值(C )的值
- 无法通过循环运行我的代码,但是手动复制和粘贴有效
- glGenVertexArrays在主循环中不创建唯一的VAO,但在其他情况下有效
- 检查输入是有效的C 循环时的DO
- 对于同一循环的这两个连续组,是否有更有效的解决方案
- 在C++中,将"if"放在 for 循环之外还是将"if"放在 for 循环中更有效
- 试图在C++中验证双精度有效输入的循环错误
- 哪个for循环在C++中更有效
- 有效用户输入c++的循环