0

すべてのチェック/検証が実行時に実行されるため、リフレクションが少し遅いことはわかっています。

リフレクションを使用してクラスをインスタンス化し、そのクラスでメソッドを呼び出すとします。したがって、私の質問は、呼び出しが常に遅い(通常のケースより 1% 遅い場合でも) か、それとも初回のみかということです。このクラスは、複数回呼び出される Web アプリケーションの一部であるとします。

私の混乱のもう 1 つの側面は、最近の JVM のほとんどが JIT コンパイラを使用していることです。そのため、JVM は後続の呼び出しを最適化しようとしません。

4

2 に答える 2

1

はい、連続した呼び出しでもはるかに遅くなります。呼び出しのセットアップとティアダウンの動作が必要であるため、低速です。そうでない場合は、コンパイラによってバイトコードにハードコーディングされます。

于 2012-12-04T18:05:00.117 に答える
1

はい、呼び出しは常に遅くなります。JITコンパイラは、Javaバイトコードを最適化し、ネイティブコードにコンパイルします。メソッドの結果をメモ化またはキャッシュすることはありません。リフレクションAPIを呼び出すことは、メソッドを呼び出すことを意味します。コンパイルされたネイティブコードは、呼び出しのたびにランタイムのリフレクション機能を呼び出しますが、これは遅いことです

リフレクションを使用してメソッドを呼び出す方が、直接呼び出すよりも常にはるかに遅くなります。ただし、メソッドの本体は通常の速度で実行されることに注意してください。低速になるのは、メソッドを呼び出すプロセスだけです。

いつものように、コードのプロファイルを作成します。リフレクションによるインスタンス化とメソッド呼び出しがボトルネックであることが判明した場合は、それに応じて最適化します。(たとえば、呼び出されたメソッドがデータベースにクエリを実行している場合、そのアクションがボトルネックになる可能性が高く、リフレクションによって生じるオーバーヘッドが問題になる可能性はほとんどありません。)

于 2012-12-04T18:06:07.280 に答える