Javaリフレクションパフォーマンス 質問する

Javaリフレクションパフォーマンス 質問する

クラス コンストラクターを呼び出すのではなく、リフレクションを使用してオブジェクトを作成すると、パフォーマンスに大きな違いが生じますか?

ベストアンサー1

そのとおり。リフレクションを介してクラスを検索すると、大きさによって、 もっと高い。

引用Javaのリフレクションに関するドキュメント:

リフレクションには動的に解決される型が関係するため、特定の Java 仮想マシンの最適化は実行できません。その結果、リフレクション操作は非リフレクション操作よりもパフォーマンスが遅くなるため、パフォーマンスが重要なアプリケーションで頻繁に呼び出されるコード セクションではリフレクション操作を避ける必要があります。

以下は、Sun JRE 6u10 を実行している私のマシンで 5 分で作成した簡単なテストです。

public class Main {

    public static void main(String[] args) throws Exception
    {
        doRegular();
        doReflection();
    }

    public static void doRegular() throws Exception
    {
        long start = System.currentTimeMillis();
        for (int i=0; i<1000000; i++)
        {
            A a = new A();
            a.doSomeThing();
        }
        System.out.println(System.currentTimeMillis() - start);
    }

    public static void doReflection() throws Exception
    {
        long start = System.currentTimeMillis();
        for (int i=0; i<1000000; i++)
        {
            A a = (A) Class.forName("misc.A").newInstance();
            a.doSomeThing();
        }
        System.out.println(System.currentTimeMillis() - start);
    }
}

結果は次の通りです:

35 // no reflection
465 // using reflection

ルックアップとインスタンス化は一緒に行われることを念頭に置いてください。場合によっては、ルックアップをリファクタリングして削除することもできますが、これは単なる基本的な例です。

インスタンス化するだけでも、パフォーマンスが低下します。

30 // no reflection
47 // reflection using one lookup, only instantiating

繰り返しますが、YMMV です。

おすすめ記事