1. ホーム
  2. java

[解決済み] Java Reflectionのパフォーマンス

2022-04-14 16:42:54

質問

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

どのように解決するのですか?

はい - 絶対です。 リフレクションでクラスを調べることは 大きさによって より高価になります。

引用元 リフレクションに関する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です。