我的应用程序有一个相当严格的时间限制。偶尔我们会得到需要丢弃的病理输入。有一个循环存在瓶颈,它有很多迭代。在Xe6左右。任何需要超过30毫秒的东西都是糟糕的输入,我知道然后我可以放弃它。
检查时间和结束循环的性能最差的方法是什么?
我查看了QueryHighPerformanceCounter(),但这增加了相当高的开销,超过1毫秒。此外,这比我真正需要的更精确。我真的不知道各种时序的性能影响。
有什么建议吗?
答案 0 :(得分:1)
我可能会在一个线程中运行循环。我设置了两个Event对象:一个用于表示处理已完成,另一个用于表示线程应该退出。该线程在退出循环时设置第一个。它通过调用(例如)WaitForSingleObject来定期检查第二个,其超时为0,经常足以让你每隔几毫秒左右就会这样做一次。给定1e6次迭代和30 ms,让我们说一次非常30.000次迭代。如果设置了该事件,它将退出循环。
我有另一个线程在第一个Event上执行WaitForSingleObject。当它调用WaitForSingleObject时,它指定30毫秒的超时。当WaitForSingleObject返回时,它会检查返回值。如果因为事件已设置而返回,则处理完成,您可以继续。如果超时,则设置第二个事件,并且线程下次检查事件时,它会看到已发出信号以停止处理,因此它退出循环。
这显然不是唯一可能的工作方式,但它是一个非常简单的应该具有相当小的开销。在循环中发生的唯一部分是对WaitForSingleObject的零超时调用。
至少在我对合理近期CPU的测试中,你可以预期每个调用大约需要0.2微秒,因此你需要在30毫秒的处理时间内添加大约6微秒的时间。现在,您将处理速度降低了不到1%。我怀疑可以可靠地测量处理速度的差异,更不用说它会产生任何显着的差异。