小编典典

Java 反射性能

all

使用反射创建对象而不是调用类构造函数会导致任何显着的性能差异吗?


阅读 92

收藏
2022-07-12

共1个答案

小编典典

是的,一点没错。 从数量上看 ,通过反射查找课程的成本更高。

引用Java 的关于反射的文档

由于反射涉及动态解析的类型,因此无法执行某些 Java
虚拟机优化。因此,反射操作的性能比它们的非反射对应物慢,并且应该避免在对性能敏感的应用程序中频繁调用的代码部分中。

这是我在我的机器上用 5 分钟完成的一个简单测试,运行 Sun JRE 6u10:

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。

2022-07-12