如果我们使用反射,会丢失什么样的运行时优化

时间:2013-10-08 16:53:41

标签: java reflection

在有关使用reflection的性能开销的讨论中,声明:

  

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

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

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

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

2 个答案:

答案 0 :(得分:3)

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

如果您使用了反射,我怀疑它仍然可以执行某些操作,尽管您无法使用反射访问局部变量。

答案 1 :(得分:0)

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

虽然您的问题所概述的原始值的直接代码将被添加到一些汇编指令中,但是反射调用为优化器提供了很少有关正在发生的事情的信息,因此几乎不能进行优化。

如果你对它进行基准测试,你会发现与“直接”代码相比,反射的速度要慢一些。