c++ - 在 x 时间后结束循环的最低性能密集方式

标签 c++ visual-c++ optimization

我的申请有相当严格的时间限制。偶尔我们会收到我需要丢弃的病态输入。有一个瓶颈循环,它有很多迭代。 Xe6左右。任何超过 30 毫秒的输入都是错误的输入,我知道我可以放弃它。

检查时间和结束循环的性能强度最低的方法是什么?

我查看了 QueryHighPerformanceCounter(),但这增加了相当高的开销,超过 1 毫秒。此外,这比我真正需要的更精确。我真的不知道各种时序对性能的影响。

有什么建议吗?

最佳答案

我可能会在线程中运行循环。我将设置两个 Event 对象:一个表示处理已完成,另一个表示线程应该退出。该线程在退出循环时设置第一个。它通过调用(例如)超时为 0 的 WaitForSingleObject 来定期检查第二个,您可以期望它每隔几毫秒左右执行一次。给定 1e6 次迭代和 30 毫秒,假设一次非常 30.000 次迭代。如果设置了该事件,它将退出循环。

我有另一个线程在第一个事件上执行 WaitForSingleObject。当它调用 WaitForSingleObject 时,它指定 30 毫秒的超时。当 WaitForSingleObject 返回时,它检查返回值。如果它因为设置了事件而返回,则处理完成,您可以继续。如果超时,您设置第二个事件,下次线程检查事件时,它会看到它已收到停止处理的信号,因此它退出循环。

这显然不是完成这项工作的唯一可能方法,但它是一种非常简单的方法,开销应该非常小。循环中唯一会发生的部分是对 WaitForSingleObject 的零超时调用。

至少在我对相当新的 CPU 进行的测试中,您可以预期每个调用大约需要 0.2 微秒,因此您在 30 毫秒的处理过程中总共增加了大约 6 微秒。 IOW,您将处理速度减慢了不到 1%。我怀疑处理速度的差异是否可以可靠地衡量,更不用说它会产生任何显着差异了。

关于c++ - 在 x 时间后结束循环的最低性能密集方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27612997/

相关文章:

javascript - 执行此操作的最快方法?三元运算符?转变?大批?

c++ - glGenLists(1) 在 OnPaint() 外用 wxThread 返回 0

c++ - 重载运算符 !=

c++ - Visual C++ 2012 似乎不尊重 lambda 中的默认捕获

c++ - 类、函数的前向声明

language-agnostic - 哪些优化可以立即进行?

c++ - midifile : getDurationInSeconds is 0 for all events

c++ - '+' 不能添加两个指针,而只是打印一个 int 和一个显式字符串?

c++ - VC++ 说 "no overloaded function takes 7 arguments"我说是的!

javascript - 编写此函数的更有效/优化的方法是什么