私はこのように書かれた時間に敏感なバックトラッキングプログラムを見てきました。コンパイラがメモリコピーを避けてより高速なメソッド呼び出しを行うことができると思います。再帰的なプログラムで役に立ちます。メソッドの引数をfinalとしてマークすると、メソッド呼び出しが高速になりますか?
これは私の推測ですが、詳しい説明や記事、または反論が欲しいです。
私はこのように書かれた時間に敏感なバックトラッキングプログラムを見てきました。コンパイラがメモリコピーを避けてより高速なメソッド呼び出しを行うことができると思います。再帰的なプログラムで役に立ちます。メソッドの引数をfinalとしてマークすると、メソッド呼び出しが高速になりますか?
これは私の推測ですが、詳しい説明や記事、または反論が欲しいです。
それは、パフォーマンス上のゼロ影響を与えているが - 確かに、それはまったくのランタイム効果がありません。
2つのメソッドを含むクラスをコンパイルする場合(パラメータはfinalとマークされ、もう一方はない場合)、メソッドごとに生成されるバイトコードを調べると、違いはありませんメソッド名以外)。
最後のキーワードは、このコンテキストでは、その変数をメソッド内で再割り当てできないようにします。
KC203のリンクより:パフォーマンスのため JSR 133で提案された修正されたメモリモデルには、最終フィールドのための特別な規定、既存の仕様にはない規定が含まれています。より新しいVMはすでにこの仕様を実装し、それに応じて最終フィールドを扱います。最終フィールドは正確に1回割り当てられるため、マルチスレッドコンテキストでの積極的な最適化が可能になります。具体的には、値が決して変更されないことが保証されているので、フィールドを再ロードする必要はありません。 – andandandand
また、最終メソッドは宣言クラスでのみ実装されるため、最終メソッドへの呼び出しを動的にディスパッチする必要はなく、代わりに静的呼び出しを使用できます。コンパイラは、通常の仮想メソッド呼び出しプロシージャをまったく迂回して、メソッドへの直接呼び出しを発行できます。このため、最終メソッドはJust-In-Timeコンパイラまたは類似の最適化ツールによるインライン展開の候補にもなります。 (プライベート/静的メソッドはすでに最終的なので、常にこの最適化のために考慮する必要があります) – andandandand
古代のJVMやマルチスレッドアプリケーションでは、パフォーマンスが向上しているようです。 – andandandand
良いポインタ。私は、コンパイラがそのメソッドの存続期間中に与えられた値が変更されないことを知っているときに、 "積極的な最適化"が可能になることを、キーポイントと考えています。 – Marvo
非常に有益で興味深い、特にマルチスレッドに関する部分。 – andandandand
@Marvo、必ずしも真実ではありません。 JVMのクラスローダーは、サブクラスがロードされているかどうかを知っています。サブクラスがロードされていない場合、メソッド呼び出しを動的にディスパッチしないことが分かります。サブクラスがそのメソッドをオーバーライドしない場合、サブクラスはメソッド呼び出しを動的にディスパッチする必要がないことも認識します。 –