4

1 秒間に何千回も読み取られて更新される変数があります。定期的にリセットする必要があります。しかし、「半分」の時間、値はすでにリセット値です。リセット (書き込み操作) する前に、最初に値をチェックする (リセットが必要かどうかを確認する) ことをお勧めしますか、それとも関係なくリセットする必要がありますか? 主な目標は、パフォーマンスのためにコードを最適化することです。

説明する:

Random r = new Random();
int val = Integer.MAX_VALUE;

for (int i=0; i<100000000; i++) {
    if (i % 2 == 0)
        val = Integer.MAX_VALUE;
    else
        val = r.nextInt();

    if (val != Integer.MAX_VALUE) //skip check?
        val = Integer.MAX_VALUE;
}

上記のプログラムを使用して 2 つのシナリオをテストしようとしましたが (2 番目の「if」行のコメントを外して)、実行時間の自然な差異によって違いが隠されています。

ありがとう。

4

3 に答える 3

5

チェックしないでください。

より多くの実行ステップ = より多くのサイクル = より多くの時間です。


余談ですが、基本的なソフトウェアの黄金律の 1 つ、「早期に最適化しないでください」を破っています。コードがパフォーマンスの問題である場合、この部分の明確な証拠がない限り、それを見るべきではありません。(パフォーマンスを考慮せずにコーディングするという意味ではなく、通常のベスト プラクティスに従いますが、「パフォーマンス関連」のみを目的とする特別なコードを追加しないことに注意してください)

于 2012-12-03T18:59:54.790 に答える
0

このチェックは、実際のパフォーマンスには影響しません。単一のクロックサイクルか何かについて話しているのですが、これは通常、Java プログラムでは関係ありません (ハードコアな数値処理は通常 Java では行われないため)。

代わりに、可読性に基づいて決定してください。このコードを 5 年後に変更するメンテナーのことを考えてみてください。

あなたの例の場合、私の理論的根拠を使用して、チェックをスキップします。

于 2012-12-03T18:59:33.537 に答える
0

ほとんどの場合、JIT は何もしないため、コードを最適化します。

通常は、パフォーマンスを気にするよりも、

  • 理解しやすい
  • 実装するクリーナー

どちらの場合も、コードは何の役にも立たず、コードを高速化する可能性があるため、コードを削除することもできます。

コードが少し遅くなったとしても、安くはない呼び出しのコストと比較して非常に小さいでしょうr.nextInt()

于 2012-12-03T19:01:48.670 に答える