Java 反射 : Why is it so slow?

标签 java performance reflection

基于 Java 反射慢的名声,我一直避免使用它。我在当前项目的设计中达到了一个点,能够使用它会使我的代码更具可读性和优雅,所以我决定试一试。

我只是对差异感到惊讶,我注意到有时运行时间几乎长了 100 倍。即使在这个只实例化一个空类的简单示例中,也令人难以置信。

class B {

}

public class Test {

    public static long timeDiff(long old) {
        return System.currentTimeMillis() - old;
    }

    public static void main(String args[]) throws Exception {

        long numTrials = (long) Math.pow(10, 7);

        long millis;

        millis = System.currentTimeMillis();

        for (int i=0; i<numTrials; i++) {
            new B();
        }
        System.out.println("Normal instaniation took: "
                 + timeDiff(millis) + "ms");

        millis = System.currentTimeMillis();

        Class<B> c = B.class;

        for (int i=0; i<numTrials; i++) {
            c.newInstance();
        }

        System.out.println("Reflecting instantiation took:" 
              + timeDiff(millis) + "ms");

    }
}

真的,我的问题是

  • 为什么这么慢?有什么我做错了吗? (即使上面的例子也证明了差异)。我很难相信它真的比普通实例化慢 100 倍。

  • 还有其他东西可以更好地用于将代码视为数据(请记住,我现在被 Java 困住了)

最佳答案

反射缓慢有几个明显的原因:

  1. 编译器无法进行任何优化,因为它无法真正了解您在做什么。这可能也适用于 JIT
  2. 所有被调用/创建的东西都必须发现(即按名称查找类,查找匹配的方法等)
  3. 参数需要通过装箱/拆箱、包装成数组、Exceptions 包裹在 InvocationTargetException 中并重新抛出等方式进行修饰。
  4. Jon Skeet mentions here 的所有处理.

仅仅因为某些东西慢了 100 倍并不意味着它对你来说太慢假设反射是你设计程序的“正确方法”。例如,我认为 IDE 大量使用反射,从性能角度来看,我的 IDE 大部分都可以。

毕竟,当相比,例如解析 XML 或 访问一个数据库!

要记住的另一点是,微基准是一种众所周知的缺陷机制​​,用于确定某事物在实践中的速度。以及 Tim Bender's remarks ,JVM 需要时间来“预热”,JIT 可以即时重新优化代码热点等。

关于Java 反射 : Why is it so slow?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1392351/

相关文章:

java - 使用反射查找方法是否重载

java - 解析格式错误/不完整/无效的 XML 文件

java - 如何使用java为JSON中单个数组中的每个元素添加对象?

java - 初始化类 com.jacob.com.Dispatch 时出错

javascript - 不同页面加载不同的js文件还是一起加载?

java - Java中连续将小文件读入对象的最有效方法

python - 为什么 Python 的数值计算速度这么慢?

reflection - 戈朗 : how to use interface{} type to insert a value into the middle of a slice?

java - Hibernate 4.3,在构建 SessionFactory 时为什么我们必须提供两次属性?

vb.net - 获取调用方法的名称