2016-07-24 6 views
1

それぞれの値と実行コードのコレクションを検索していて、特定の品質を見つけたらブール値をオンにして、コードを実行したときにもう一度オフに戻したいブール値をオフにする必要があるかどうかをチェックする条件を実行する方が速いのですか、それともすべてのループで簡単にオフにする方が速いのですか?条件を確認することと、変数を複数回設定すること。低レベルの最適化

例えば(擬似コード):

bool found = false; 
for(particle in literallyAHaystack) { 
    bool isNeedle = particle == "needle"; 

    if(isNeedle) { 
     found = true; 
    } 

    // [some code that uses the 'found' variable] 

    if(isNeedle) { 
     found = false; 
    } 
} 

bool found = false; 
for(particle in literallyAHaystack) { 
    bool isNeedle = particle == "needle"; 

    if(isNeedle) { 
     found = true; 
    } 

    // [some code that uses the 'found' variable] 

    found = false; // a conditional no longer surrounds this statement 
} 

私は、これは非常に低レベル、通常は、無意味な最適化であることを理解、私はまだ真実に興味

対それの。私はその質問の些細なことで誰にも怒らないことを願っています。

+0

なぜ、あなたはisNeedleとfoundの両方を持っていますか?彼らは重複しているようです。 – user2357112

+0

@ user2357112:考えられるのは、 'found'が' if'の中の何かによって設定されるかもしれないと想像していると思うので、前のチェックの結果を記録するためにbooleanを持たない 'if()'節を入れます。コードの複製。 –

答えて

1

bool foundがローカル変数の場合、すべてのCPUアーキテクチャでほぼすべてのケースでほぼ確実にfalseに設定することがほぼ確実です。分岐ロジックの一部に変わるのではなく、コンパイラの出力にすべて存在する場合は、たぶんレジスタにしか入りません。可能な限り安価な操作の1つをレジスタに書き込み、分岐よりもはるかに安い。

メモリにヒットしたとしても、ライトバックキャッシュが一般的です。したがって、大きな共有キャッシュまたはメインメモリへのトラフィックを生成せずにL1にヒットする同じ場所に繰り返し格納します。


コンパイラは、次の反復は、(インテルハズウエルに例えば)〜5サイクルのストア転送遅延を招くであろうフラグをチェックし、すべてのループの終了時に実際にメモリ内のフラグを格納するコードを発する場合。

問題が発生した場合は、コードを最適化していないとコンパイラの責任です。これは、asmで直接書くのではなく、コンパイラを使う理由です。コンパイラは、foundの変数を完全に最適化します。それは問題ありません。

x86のこの種の詳細については、http://agner.org/optimize/タグwikiの他のリンクを参照してください。

http://gcc.godbolt.org/にそれを置く、あなたのコードがコンパイル方法を確認するには(とO3 -march=haswell -ffast-mathか何かを使用しています。)


foundは(そして最後の別のスレッドによって変更されている場合があります)グローバルであれば、それは多分できましたコードを実行するコアは、他のコアのキャッシュラインのコピーを無効にする必要はありません。

私は、異なるスレッドが使用する共有状態構造体(ロックによって保護されたクリティカルセクションのコードによって使用される)の一部であるフラグを想像しています。しかし、これはひどいデザインですが、使用後はfoundが常にfalseのまま残るため、永続的な状態はないので、ローカルでなければなりません)。

まだ、その店を避けてください。いずれかのループ反復でフラグが全く変更されていない場合(つまり、針が一致する場合)、好きなだけ頻繁に変更することもできます。

店舗を避けることは、ほとんどの場合、少ない店舗だけでなく、同じ店舗から同じ店舗に行くことができる場合に便利です。キャッシュが機能する。

ベクトル化するときに、4つすべてではなく3つのベクトル要素を書きたい場合は、目的地に重複するストアを行うと便利なことがあります。格納しているものの終わりを超えて書き直しても構いません。例えばthis codeにあります。

+0

ありがとう、そんなに。私はサンプルコードが完全な意味を持っていないことを知っていますが、あなたはその質問に正確に答えました。 –

0

条件チェックがないため、ジャンプが必要ないため、2番目は「高速」になります。

著しく高速でしょうか?ほとんど間違いない。いずれにせよ、コンパイラかもしれませんが、この最適化をすでに行っていますが、私にはそれを引用していません。

関連する問題