3

X という変数があるとします。たとえば、5 秒ごとに X = true にしたいとします。(この 5 秒間は true または false のいずれかになりますが、5 秒経過すると true にリセットされます)。

値がすでに true かどうかを確認し、そうでない場合は true に再割り当てする方が効率的でしょうか? それとも単に X = true ですか?

言い換えれば、どちらがより速く実行されるでしょうか?

if(x==false){
    x = true;
}

x = true;

一方では、最初のプログラムは、必要がなければ変数を変更しません。一方、2 番目のプログラムでは、X が何に等しいかをチェックする必要はありません。まっすぐ潜ります。

4

4 に答える 4

8
  • ほとんどの場合、問題になりません。最も理解しやすく保守しやすいコードを記述します。必要な場合にのみ最適化してください。
  • 確認する最善の方法は、テストすることです。コードをプロファイリングします。
  • どちらが速いかは、ブラウザによって異なる場合があります。
  • どちらが速いかは、変数が通常 true か false かによって異なります。
  • そうは言っても、ほとんどのシナリオでは、テストせずに変数を設定する方が高速になると思います。
于 2010-06-14T16:59:58.793 に答える
4

本当にあなたのデータに依存します:)

x == 90% の確率で false の場合、x への直接代入の方が高速です。

これは、おそらく効率を気にしたくない場所の 1 つです。

于 2010-06-14T17:01:05.753 に答える
2

免責事項/警告:

これはマイクロ最適化であり、ユーザーが測定できる方法でプログラムの効率に影響を与えることはありません。すべてのコンパイラの最適化をオフにして、優れたプロファイラーを実行すると、効果を定量化できる場合がありますが、ユーザーは気付くことはありません。

これは、問題のコードが数秒ごとにしか実行されない状況に特に当てはまります。プロファイリングに費やす時間は、アプリケーションの他の部分の改善に費やすほうがよいでしょう。

また、これらの状況では、ボトルネックのないマイクロ最適化よりも読みやすさが常に優先される必要があります(ただし、以下の私の回答では、要求に応じてランタイム効率のみが考慮されます)。したがって、この状況で使用することをお勧めするコードは です。これはx=true、最も読みやすく理解しやすいためです。

最後に、チェックを追加すると速度が向上する場合、コンパイラはおそらくそれを既に認識しており、実行してくれるので、失敗することはありませんx=true(そのため、プロファイラーを実行する前に最適化をオフにする必要があります)。


答え:

これを理解する唯一の真の方法は、プロファイリングです。0 テスト (x==false) は基本的にまったく時間がかからないことがわかるかもしれません。したがって、x が true であることが判明したときに時間を節約できるため、含める価値があります。または、x が false であることが判明したときに、テストに時間がかかりすぎて時間を無駄にしている場合があります。

私の推測では、テストは不要です。これは、0 テストやその他のビット演算 (and、or など) がすべて非常に高速であるため、通常は基本的に同じ時間かかるものとして扱っているためです。また、0-テストに OR 操作 (true に設定) と同じ時間がかかる場合、0-テストは冗長な時間の無駄です。もちろん、プロファイリングは私が間違っていることを証明する可能性があり、私の推測はビット単位の操作に関する大まかな仮定に基づいているため、プロファイラーを実行してこれを理解することを選択した場合、私は間違いなく結果に興味があります.

于 2010-06-14T17:15:53.417 に答える
1

これによって達成しようとしている効率は、全体的な設計の品質によって達成される効率と比較してわずかです。

于 2010-06-14T17:07:24.810 に答える