28
if (var != X)
  var = X;

それは賢明ですか?コンパイラは常に if ステートメントを最適化しますか? if ステートメントの恩恵を受けるユースケースはありますか?

varvolatile 変数の場合はどうなりますか?

volatile 変数は両方の言語で異なるセマンティクスを持つため、C++ と Java の両方の回答に興味があります。また、Java の JIT コンパイルも違いを生む可能性があります。

if ステートメントは、常に var を X で上書きした場合には発生しない分岐と追加の読み取りを導入するため、悪いことです。一方、var == Xこの最適化を使用すると、読み取りのみを実行し、書き込みは実行しないため、キャッシュに影響を与える可能性があります。明らかに、ここにはいくつかのトレードオフがあります。実際にどのように見えるか知りたいです。誰かがこれについてテストを行いましたか?

編集:

マルチプロセッサ環境でどのように見えるかについて、私は主に興味があります。些細な状況では、変数を最初にチェックすることにあまり意味がないように思われます。ただし、プロセッサ/コア間でキャッシュの一貫性を維持する必要がある場合は、追加のチェックが実際に役立つ場合があります。どれほど大きな影響を与えることができるのだろうか?また、プロセッサはそのような最適化自体を行うべきではありませんか? var == Xもう一度値を割り当てても、Xキャッシュが「汚れる」ことはありません。しかし、これに頼ることができますか?

4

8 に答える 8

9

その値を書き込む前に、変数が特定の値を保持しているかどうかを確認するのは賢明な最適化ですか?

if ステートメントの恩恵を受けるユースケースはありますか?

を返す不等式比較よりも代入の方がはるかにコストがかかる場合falseです。

std::set例としては、複製するために多くのヒープ割り当てが必要になる場合がある large*があります。

**「大」の定義について*

コンパイラは常に if ステートメントを最適化しますか?

「最適化」と「常に」の両方を含むほとんどの質問と同様に、これはかなり安全な「いいえ」です。

C++ 標準では、最適化について言及することはめったにありませんが、要求することはありません。

var が揮発性変数の場合はどうなりますか?

その後、ほとんどの人が想定するものを達成しませんが、それ実行する可能性があります。ifvolatile

于 2013-04-19T22:55:39.710 に答える
5

ポインターサイズの変数などの些細な代入でさえ、読み取りや分岐よりもコストがかかる場合があります (特に予測可能な場合)。

なんで?マルチスレッド。複数のスレッドが同じ値のみを読み取っている場合、すべてのスレッドがキャッシュ内でその値を共有できます。ただし、書き込み後すぐに、キャッシュラインを無効にして、次に読み取るときに新しい値を取得するか、キャッシュの一貫性を保つために更新された値を取得する必要があります。どちらの状況でも、コア間のトラフィックが増加し、読み取りにレイテンシが追加されます。

ブランチがかなり予測できない場合は、おそらくまだ遅いでしょう。

于 2013-04-20T01:08:44.383 に答える
1

通常、読み取りは書き込みよりも混乱が少ない場合はいつでも、読み取り/書き込みロックのセマンティクスが含まれていると賢明です。

于 2013-04-19T22:58:52.333 に答える
1

Objective-C では、オブジェクト アドレスをポインター変数に割り当てるために、オブジェクトを "保持" (参照カウントをインクリメント) する必要がある場合があります。このような場合、割り当てられている値が現在ポインター変数にある値と同じかどうかを確認して、比較的コストのかかるインクリメント/デクリメント操作を実行する必要がないようにすることは理にかなっています。

参照カウントを使用する他の言語にも、同様のシナリオがある可能性があります。

しかし、単純な変数 (別の場所で説明したマルチプロセッサ キャッシュのシナリオ以外) に anintまたは abooleanを代入する場合、テストに値することはめったにありません。ほとんどのプロセッサのストアの速度は、少なくともロード/テスト/ブランチと同じくらい高速です。

于 2013-04-19T23:42:33.203 に答える
0

Java では、答えは常にノーです。Java で実行できる割り当てはすべて基本的なものです。C++ では、答えはほとんど常にいいえです。コピーが等価チェックよりもはるかにコストがかかる場合、問題のクラスはその等価チェック自体を行う必要があります。

于 2013-04-19T23:03:05.110 に答える