嗨,我正在优化一个应该为我提供“下一个”功能的函数。到目前为止我得到的是
int fun(int a){
const int k = ...;
for(;test_value(a++) != k;);
return a;
}
这是一种快速而肮脏的方法来测试我的算法是否确实有效,但现在我担心循环会在每次迭代时进行分支测试(如果不是编译器非常擅长在幕后处理它?) 。假设任何 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/