2013-10-08 21 views
9

在有关使用reflection的性能开销讨论什么样的运行时优化的丢失,它指出:如果我们使用反射

使用反射可能会丢失一些运行时优化。使用Field.set *

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

等效代码()可能无法:例如,下面的代码很可能被由Java虚拟机进行了优化。

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

+0

它只会运行'x = 3'。当你对混合进行反射时,各种内联技巧,操作码消除等都会消失。 –

+0

这是一个有趣的问题,但我认为这对于单个SO问题来说太广泛了。 – chrylis

+0

x的赋值什么也不做。它是一个局部变量,没有多线程,没有并发性,可以被删除。如果使用Field.set,其他线程可能有权访问变量,因此永远无法进行优化。这是我的想法。 –

回答

0

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

虽然您的问题所概述的原始值上的直接代码将被分解为几个汇编指令,但反射调用只会给优化器提供有关正在发生的事情的很少信息,因此很少进行优化。

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

+1

你能详细说明你的最后一行吗?你是如何得出'数量级'结论的? – Victor

+0

反射可以像直接代码一样快,这取决于你做什么以及如何做。特别是,安全检查等仅对首次访问有影响... – assylias

+0

只需对其进行测试即可。 (1)进行体面的热身(> 10000次迭代),以便JIT开始使用。避免循环原地摔跤。 –

3

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

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