if语句循环速度极慢

时间:2013-08-27 06:16:30

标签: c++ if-statement

如果我这样做......

vector< array<double,2> > magT(magnitude.size(), array<double,2>() );

for ( int n = 0; n < magnitude.size()-amount; n++ ) {
    for ( int chan = 0; chan < channels; chan++ ) {

        for ( int m = 0; m < amount; m++ ) {
            magT.at(n).at(chan) += magnitude.at(n+m).at(chan);
        }

        magT.at(n).at(chan) /= amount;
    }
}

magnitude = magT;

......闪电般快速。但是,如果我添加几个像这样的if语句......

vector< array<double,2> > magT(magnitude.size(), array<double,2>() );

int upper = ceil(amount/2);
int lower = floor(-amount/2);

for ( int n = 0; n < magnitude.size(); n++ ) {
    for ( int chan = 0; chan < channels; chan++ ) {

        for ( int m = lower; m < upper; m++ ) {
            m = n+m < 0 ? 0 : m;
            m = n+m > magnitude.size()-1 ? 0 : m;
            magT.at(n).at(chan) += magnitude.at(n+m).at(chan);
        }

        magT.at(n).at(chan) /= amount;
    }
}

magnitude = magT;

... 数百次慢,可能是数千。逻辑陈述真的很慢吗?我应该让它们脱离这样的嵌套循环吗?如果是这样,我如何合理地完成这样的事情?

1 个答案:

答案 0 :(得分:2)

这里减速的原因可能是处理器流水线的设计。通常处理器预测未来的指令(并启动它),但如果预测器错误,一切都变得缓慢(因为处理器必须忘记预先计算的结果)。

因此最好避免在循环中使用'if'指令。

有时写作更好   m =(n + m <0)? 0:m; 代替   if(n + m <0)m = 0; (这里一切都取决于编译器的优化选项,所以有时这个推荐不起作用。)