如果我这样做......
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;
... 数百次慢,可能是数千。逻辑陈述真的很慢吗?我应该让它们脱离这样的嵌套循环吗?如果是这样,我如何合理地完成这样的事情?
答案 0 :(得分:2)
这里减速的原因可能是处理器流水线的设计。通常处理器预测未来的指令(并启动它),但如果预测器错误,一切都变得缓慢(因为处理器必须忘记预先计算的结果)。
因此最好避免在循环中使用'if'指令。
有时写作更好 m =(n + m <0)? 0:m; 代替 if(n + m <0)m = 0; (这里一切都取决于编译器的优化选项,所以有时这个推荐不起作用。)