0

多くのオブジェクトで特定のブール変数をクリアしたい場合、これらのオブジェクトの 1 つが後でこの変数を設定する必要がある場合、最も効率的な方法は次のとおりです。

  • すべてのオブジェクトを反復し、var = false を設定するだけです
  • すべてのオブジェクトを反復し、var をチェックして、true の場合は false に設定します
class Foo {
   boolean bar;  //false for most objects
}

次に、次のいずれかを使用します。

for (Foo foo : fooList) {
   foo.setBar(false);
}

また:

for (Foo foo : fooList) {
    if (foo.isBar()) {
       foo.setBar(false);
    }
}

次に、1 つの foo を設定します。

singleFoo.setBar(true);

おそらく、両方の実装で時間の節約はわずかです。しかし、私はその気圧を測定することはできませんので、あなたがより良いアプローチであることに興味がありますか?

4

6 に答える 6

5

コンパイラがこれら2つの例を平準化するかどうかはわかりません。しかし、これがあなたにとってパフォーマンスのボトルネックだったとしたら、私は非常に驚いています。

これを使用してください:

for (Foo foo : fooList) {
   foo.setBar(false);
}

読みやすいように

于 2013-03-04T16:22:55.907 に答える
2

あなたが何をしようとしているのかわかりませんが、あなたが言ったように、時間の違いはわずかです。、しかし答えは簡単です。値を変更するだけでおそらく「速く」なり、カウルが言ったように読みやすくなるので、次のようにする必要があります。

for (Foo foo : fooList) {
   foo.setBar(false);
}

少し説明すると:

他のプログラムで将来の効率を計算したいと考えているので、最良、最悪、平均のケースを計算することをお勧めします。この場合、すべてのブール値を変更する必要がある場合、またはいくつかのブール値のみを変更する必要がある場合に、各ステートメントにかかる時間を計算できます。

たとえば、時間がかかり、時間 がfoo.setBar(false)かかると言うことができます。Aif (foo.isBar())B

foosのことを体験できるのは3 つだけだとしましょう。foolist

  • 最悪の場合:bar 3 つすべてを変更する必要がありますfoos
  • 平均: 1 つまたは 2 つの多くのバーを変更する必要がある場合があります。
  • 最良のケース: バーを変更する必要はありません。

あなただけAが実行の 3 つのケースの合計時間を持っていることになります3Aでそれを行う場合、次のif時間がかかります。

  • 最悪の場合: 3A + 3B
  • 平均: (1-2)A + 3B
  • ベストケース: 3B

仮定するとB < A、if オプションは 3 番目のケースでのみ高速になります。そうすればB<<A平均は良くなります。しかし、最悪の場合は、割り当てだけを行うよりも常に悪いものになります。この場合、おそらく A と B は類似または等しいので、次のようになります (A=B):

  • 最悪の場合: 6A
  • 平均ケース: (4-5) A
  • ベストケース: 3A

したがって、最初のオプション (最初に示したもの) が最適です。

これは、直面している他の言語またはパフォーマンスの問題に役立ちます。必要に応じて、公式のJava ドキュメントを確認して、これに対する特別な VM の改善があるかどうかを確認できます。

于 2013-03-04T16:37:21.933 に答える
1

それらをすべてfalseに設定してから、1つをtrueに設定します。分岐予測に関するすばらしい投稿があります。

ソートされていない配列よりもソートされた配列を処理する方が速いのはなぜですか?

オブジェクトの大規模なセットがある場合、ステートメントが大きなボトルネックになる可能性がある場合は単純です。チェックを追加した場合に設定されるオブジェクトの数に依存するため、どれだけ重要かはわかりません。

于 2013-03-04T16:22:53.060 に答える
0

最も「効率的な」アプローチは、それらすべてをfalseに設定することです(最初のオプション)。2つ目は、1つではなく2つのメソッド呼び出しを必要とします。もちろん、効率の違いはほぼ間違いなく重要ではありません。falseに設定される前に、誰がfalseであったかを知りたい(またはログに記録した)理由がある場合は、後のアプローチが明らかに進むべき道です。

于 2013-03-04T16:26:45.497 に答える
0

あなたが話しているのは、JITコンパイラレベルの最適化です。コードを書くときは、それらを考慮しないでください。最適化する前に、まずプロファイルを作成します。そして、最も遅い場所から最適化を開始してから、下に移動します。

于 2013-03-04T16:29:40.867 に答える
0

これはより良いアプローチです

for (Foo foo : fooList) {
   foo.setBar(false);
}

それはより明確であり、たとえば、実際に遅いコードをより速く実行するために費やすことができる不明確なコードを書いたりいじったりすることから節約される時間です。

于 2013-03-04T16:24:40.960 に答える