快速检查号码是大号码的倍数

时间:2013-11-19 16:18:33

标签: c++ optimization

我有一个必须及时限制的递归算法。如果花了太长时间,我打算打断它。我按照以下方式定期检查时间:

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?

2 个答案:

答案 0 :(得分:1)

由于1024 * 1024是2的幂,你可以通过AND1024*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
}