作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
基于 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 困住了)
最佳答案
反射缓慢有几个明显的原因:
JIT
Exceptions
包裹在 InvocationTargetException
中并重新抛出等方式进行修饰。仅仅因为某些东西慢了 100 倍并不意味着它对你来说太慢假设反射是你设计程序的“正确方法”。例如,我认为 IDE 大量使用反射,从性能角度来看,我的 IDE 大部分都可以。
毕竟,当与相比,例如解析 XML 或 访问一个数据库!
要记住的另一点是,微基准是一种众所周知的缺陷机制,用于确定某事物在实践中的速度。以及 Tim Bender's remarks ,JVM 需要时间来“预热”,JIT 可以即时重新优化代码热点等。
关于Java 反射 : Why is it so slow?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1392351/
我是一名优秀的程序员,十分优秀!