嗨,我正在优化一个应该给我一些“下一个”功能的函数。到目前为止,我所拥有的是

  int fun(int a){
    const int k = ...;
    for(;test_value(a++) != k;);
    return a;
   }


这是一种测试我的算法是否确实有效的快速而肮脏的方法,但是现在此后,我担心循环会针对每次迭代进行分支测试(如果不是,编译器非常擅长在后台进行处理?)。让我们说,任何一次满足测试的机会最多为1/5,最坏的情况为百万分之一,但test_value只是一个或两个时钟周期。有什么系统的方法可以帮助我的编译器使用算法交换所有分支,从而更好地利用CPU管道?

最佳答案

您可以稍微“展开”循环,例如:

int nomatch = 1;
while( nomatch ){
    nomatch   = (test_value(a++) != k);
    nomatch &&= (test_value(a++) != k);
    nomatch &&= (test_value(a++) != k);
    nomatch &&= (test_value(a++) != k);
    nomatch &&= (test_value(a++) != k);
}


一旦找到匹配项,这将产生较少的迭代,并且短路将阻止对test_value的求值。

像您的原始代码一样,这假定在某个时间点将找到匹配项。

关于c - 将循环转换为算术以加快功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36518021/

10-11 20:57