6

平均してどちらが速いですか?値を確認してから、必要に応じて代入するか、単に代入しますか? または、C++ 用語で:

bool b;
if(b)
    b = false;

また

b = false;

if() 条件が 50% の確率で真であると仮定します。答えは、ほとんどの場合、アーキテクチャに大きく依存します。低レベルの考慮事項を表明してください。書き込みは常にキャッシュラインを汚します - そうですか?したがって、書き込みを回避することで、0.5 ケースのキャッシュ フラッシュを回避できます。しかし、十分にスマートなキャッシュは、些細な書き込みを検出し、それ自体を汚さない可能性があります。ただし、無条件の書き込みは常に正確に 1 回のメモリ操作であり、読み書きは平均して 1.5 回の操作です。

免責事項: これは好奇心の問題であり、私が実際に直面している問題ではありません。

4

7 に答える 7

4

ブランチは最新の CPU では高価であり、メモリ アクセスは組み込み/古い CPU では高価です。したがって、読み取りよりも書き込みに時間がかかる奇妙なメモリがない限り、フラットな just-assign は常に高速になります (ヒント: 必要ありません)。

具体的には、次の理由で悪化します。

  • 分岐命令。これはプロセッサによって予測される可能性がありますが、それでもオーバーヘッドが発生する可能性があります。
  • 1回ではなく2回のメモリアクセス。ほとんどの形式のメモリでの読み取りと書き込みは同じ速度ですが、1回できるのになぜ2回行うのでしょうか?
  • コードのオーバーヘッドが増えます。ifこれはマイクロ 1 ですが、ステートメントを実行するには、さらに命令を発行する必要があります。つまり、余分な数のメモリ読み取りと、キャッシュで不必要に消費されるより多くのスペースを意味します。
  • そして、悲観的に言えば、C++ コンパイラが、他のより必要な変数ではなく、この変数をレジスタに入れることを決定したことを意味する可能性があります。
  • bまた、レジスターに入れられたと仮定すると。レジスタの読み取り/書き込みは非常に安価ですが、無料ではありません..
于 2010-03-03T22:29:10.900 に答える
1

それはさまざまなことに依存します:

  • ブランチの予測可能性(最初のシナリオ)
  • bがすでにレジスターにあるかどうか
  • 使用しているアーキテクチャ
于 2010-03-03T22:20:47.470 に答える
1

実際の結果を得るには、さまざまなアーキテクチャでこれをプロファイリングする価値があります。

于 2010-03-03T22:19:54.117 に答える
1

プロファイリングの推奨事項に加えて、書き込み要求をバックアップしているメモリによっても異なります。たとえば、メモリ マップされたフラッシュ デバイスの場合、書き込みは非常にコストがかかる可能性があります。

于 2010-03-03T22:25:55.477 に答える
1

if最近、私は非常に高速な圧縮技術に関する論文を読んでおり、最高のパフォーマンスを達成するには分岐を避ける必要があると強調されていました。その理由は、CPU パイプラインです。s を使用ifすると、CPU がコードの一部を並列実行するために行うことができる最適化の多くが中断されます。したがって、この操作が多い場合は、 を使用した方が速いかもしれませんb = false

于 2010-03-03T22:26:55.323 に答える
1

最新のパイプライン プロセッサでは、次のことを考慮する必要があります。

  • 予測を誤った分岐は多額の費用がかかります
  • ストアとロードに時間がかかる
  • キャッシュは読み取りと書き込みの両方を高速化する可能性がありますが、それがマルチキャッシュ アーキテクチャであり、複数のbキャッシュで変更されている場合、複数の書き込みは複数のキャッシュ エビクションを意味し、キャッシュのパフォーマンスを相殺する可能性があります。

条件付き書き込みを伴う読み取りには、少なくとも1 つのメモリ アクセスと、予測を誤る可能性のある分岐があります。分岐が 50% の確率で行われると仮定すると、平均で 1.5 回のメモリ アクセスが発生し、さらに予測を誤る可能性があります。

無条件書き込みには、メモリ アクセスが 1 つだけあり、分岐はまったくありません。

ここで、予測ミスのコストとストアのコストのバランスをとる必要があります。ストアのコストは、キャッシュ エージェントの数によって異なります。

于 2010-03-03T22:30:31.773 に答える
0

ポインター、参照、または基本値型の割り当てを行っている場合、個人的には直接割り当ての方が高速になると思います (プロファイラーで結果を確認したい)。50% の確率の環境では、値をレジスターに入れるより多くの命令を実行する可能性があります。代入演算子をトリガーする構造体またはクラス オブジェクトの代入は、最もコストがかかります。条件付きロジックもより多くの命令を導入し、コードの複雑さの指標に追加されます

于 2010-03-03T22:26:42.137 に答える