gpt4 book ai didi

Java 反射 : Why is it so slow?

转载 作者:IT老高 更新时间:2023-10-28 20:37:03 26 4
gpt4 key购买 nike

基于 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com