9

在关于使用反射的性能开销的讨论中,指出:

使用反射可能会导致一些运行时优化丢失。例如,以下代码极有可能被 Java 虚拟机优化:

int x = 1;
x = 2;
x = 3;

使用 Field.set*() 的等效代码可能不会。

如果没有反射,JVM 会做什么样的运行时优化?

4

2 回答 2

3

在这种情况下,代码可以被丢弃,因为它似乎没有做任何事情。

如果您使用反射,我怀疑它仍然会做一些事情,尽管您无法使用反射访问局部变量。

于 2013-10-08T16:56:07.113 回答
0

很多 JIT 优化无法完成。只需查看 JDK 源代码,通过反射设置字段值涉及安全检查和一些查找。

虽然您的问题概述的原始值上的直接代码将被处理为一些汇编指令,但反射调用为优化器提供的关于正在发生的事情的信息很少,因此几乎无法进行优化。

如果你对它进行基准测试,你会发现反射比“直接”代码慢一个数量级。

于 2013-10-08T17:10:28.567 回答