-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 に答える