5

次のタイプの呼び出しは、ウォームアップ後の多くの反復でほぼ同じ時間がかかることを示すように思われるマイクロベンチマークをまとめました。

static.method(arg);
static.finalAnonInnerClassInstance.apply(arg);
static.modifiedNonFinalAnonInnerClassInstance.apply(arg);

集約されたこれらの異なるタイプの呼び出しが異なるパフォーマンス特性を持つという証拠を見つけた人はいますか? 私の調査結果はそうではありませんが、少し驚くべきことがわかりました(特に、少なくとも静的呼び出しではバイトコードがまったく異なることを知っている)ので、他の人がいずれかの証拠を持っているかどうかを調べたいと思います。

それらが実際にまったく同じパフォーマンスを持っていた場合、それは、変更された非最終的なケースでそのレベルの間接性を持つことによるペナルティがないことを意味します.

標準的な最適化のアドバイスは「コードとプロファイルを記述してください」であることはわかっていますが、私はフレームワーク コード生成のようなものを書いているので、プロファイルする特定のコードはありません。また、静的と非最終のどちらを選択するかは、両方の柔軟性にとってかなり重要です。そしておそらくパフォーマンス。マイクロベンチマークでフレームワーク コードを使用しているため、ここに含めることはできません。

私のテストは、Windows JDK 1.7.0_06 で実行されました。

4

1 に答える 1

1

タイトなループでベンチマークすると、JVM はインスタンスをキャッシュするため、明らかな違いはありません。

コードが実際のアプリケーションで実行される場合、

  1. たとえば でString.length()使用されているように、非常に迅速に連続して実行されることが予想される場合for(int i=0; i<str.length(); i++){ short_code; }、JVM はそれを最適化します。心配はいりません。

  2. インスタンスがCPUのL1キャッシュにある可能性が高いほど頻繁に実行される場合、インスタンスの余分なロードは非常に高速です。心配ない。

  3. それ以外の場合、重要なオーバーヘッドがあります。しかし、実行頻度が非常に低いため、アプリケーションの全体的なコストからオーバーヘッドを検出することはほとんど不可能です。心配ない。

于 2012-11-22T01:08:35.880 に答える