反射会影响 Java 性能吗?
使用反射创建对象,而不是直接调用类构造函数,无疑会带来严重的性能损失。反射操作需要动态类型解析,这阻碍了 Java 虚拟机优化。
Java 关于反射的文档承认了这种性能差异:“因为反射涉及动态解析的类型,所以无法执行某些 Java 虚拟机优化...反射操作的性能比非反射操作的性能要慢。”
一个简单的测试揭示了明显的问题差异:
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); } }
结果:
请注意,此测试包括查找和实例化,但甚至包括隔离实例化会导致惩罚:
因此,虽然性能命中率可能会根据具体上下文而有所不同,但在使用反射时仍然很重要。
以上是反射对 Java 性能有多大影响?的详细内容。更多信息请关注PHP中文网其他相关文章!