-4

如果我这样做...

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;

...它慢了百倍,也许是数千倍。逻辑语句真的这么慢吗?我应该让它们远离这样的嵌套循环吗?如果是这样,我如何合理地完成这样的事情?

4

1 回答 1

1

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

所以最好避免循环中的'if'指令。

有时最好写成 m = (n+m < 0) ?0:米;而不是 if (n+m < 0) m = 0; (这里一切都取决于你的编译器的优化选项,所以有时这个建议不起作用)。

于 2013-08-27T06:22:15.020 回答