我有一个必须及时限制的递归算法。如果花了太长时间,我打算打断它。我按照以下方式定期检查时间:
int g_counter = 0;
void myfunc()
{
++g_counter;
if (g_counter % (1024 * 1024) == 0)
{
// measure time and interrupt if needed
}
...
myfunc(); // recursive call
...
}
显然,测量会降低算法速度。可以这一行:
if (g_counter % (1024 * 1024) == 0)
优化?
更新
我不坚持1024 * 1024,任何大数字都可以。我知道计算机“喜欢”两个数字的幂。那么也许任何人都可以建议更好的1024 * 1024?
答案 0 :(得分:1)
由于1024 * 1024是2的幂,你可以通过AND
与1024*1024-1
做同样的事情,如下所示:
if (g_counter & (1024 * 1024 - 1) == 0) {
...
}
请注意(1024 * 1024 - 1)
是一个常量表达式,因此它将在编译时计算。
但是,任何体面的优化器都会为你做同样的事情,所以没有必要使事情变得复杂:将当前代码改为上面的代码应该没有什么区别。
不是优化此代码,而是查看是否可以完全删除它:在单独的线程中运行算法,并设置一个计时器,该计时器将在经过一定时间间隔后唤醒主线程。这样你根本不需要检查计时器 - 系统会为你做,让你的算法只运行“有效载荷”代码。
答案 1 :(得分:1)
int g_counter = 1024*1024;
...
if(--g_counter == 0) {
g_counter = 1024*1024;
// do your other checks
}