5

メンバー変数を final としてマークすると、メイン メモリから再読み込みする必要がないため、パフォーマンス上の利点があるというのがコンセンサスのようです。私の質問は、変数が変更できないことが明らかな場合、javacまたはHotspotが自動的にこれを行うかどうかです。たとえば、javac は以下のこのクラスで 'x' を final にします...

public class MyClass {
   private String x;

   MyClass(String x) {
      this.x = x;
   }

   public String getX() {
      return x;
   }
}

二次的な点として、メンバーを final としてマークするとコードの実行が速くなるという経験的証拠を誰かが作成しましたか? リモート呼び出しやデータベース ルックアップを行うアプリケーションでは、メリットは無視できますか?

4

4 に答える 4

4

多くのパフォーマンスの「強化」と同様に、通常は問い合わせたほうがよいでしょう。どちらが理解しやすく、推論しやすいですか? たとえば、フィールドが最終的な場合、どこにも変更されないことがわかっています。これは多くの場合、より最適なコードにつながりますが、より重要なことは、より保守しやすいコードにすることです。;)

確かに、私は最終的なフィールドを最終的なものにします。個人的には、それfinalがデフォルトの動作であることを好み、変更可能にするために like キーワードを使用する必要がありましたvar

于 2011-04-05T09:23:21.577 に答える
2

javacにこれを許可することは、失敗に終わります。コンパイルされているコード(モジュール性)に依存する可能性のある別のjarにコードがある可能性があるため、最適化のためにコンパイル時にコードを変更することは実行可能なオプションではありません。

「メインメモリからリロードする必要がない」という2番目の引数については、ほとんどのインスタンス変数がキャッシュされていることを覚えておく必要があります。finalは不変性を示すだけで、揮発性を保証するものではありません(volatile ==常にメインメモリから最新のものを取得します)。したがって、マルチスレッド環境でのロックとvolatileキーワードの必要性。

ホットスポットの場合については、私には手がかりがないので、もっと知りたいです。最終定数はコンパイル時にインライン化されるため、適度なパフォーマンスの向上が可能になります。Javaでのインライン化に関する質問への参照

編集:

finalは、不変性を一粒の塩で取得する必要があることを示していることに注意してください。状態が変更できないことを保証するものではなく、オブジェクト参照を変更できることを指定するだけです。finalは、プリミティブデータ型の不変性を示します

于 2011-04-05T09:27:40.677 に答える
1

私の知る限り、彼らはそうではありません。したがって、あなたは軽微なペナルティを受けます. ただし、これは Eclipse の「クリーンアップ」機能などの IDE ツールを使用して自動的に行うことができます。

于 2011-04-05T09:09:52.903 に答える
0

最新の JVM (Hotspot コンパイラ) は値が変更されていないことを検出するので、パラメーター変数 finalを自分で作成してもパフォーマンス上の利点はないと思います。(これが間違っている場合は、リンクまたはテスト ケースを提供してください。) 例外が 1 つあります。定数 ( static final) です。

ただし、これは finalメソッドクラスでは異なる場合があります。この場合、パフォーマンスが向上する可能性があります (どのような場合かは完全にはわかりません)。ちなみに、パフォーマンスを少し向上させるのは、関数を静的にすることです (可能であれば)。

私が抱えている問題はfinal、コードが乱雑になることです。final がデフォルトになるといいですね。

于 2011-04-05T10:53:18.570 に答える