void myMethod(Object arg)
{
arg.getThing().method1();
arg.getThing().method2();
}基本的Java6安装是否会将此优化为对访问器的单个调用(可能是通过将引用存储在本地)。我意识到如果有多个线程,优化器可能不得不避免这样做。对于几乎所有的Java 6 JVM,有没有常见的优化列表?
示例:
{
Object local = arg.getThing();
local.method1();
local.method2();
}发布于 2011-11-22 17:37:56
我不期望javac编译器在这里进行任何优化,因为getThing()的值可能会随着时间和调用之间的不同而变化(例如,随机值、堆栈上的pop()操作或当前时间)。你明白了吧)。
如果发现getThing()方法总是返回相同的东西,也许JIT编译器可以对此进行优化,但我不会指望这一点。如果thing的值被另一个线程更改,即使是最简单的return thing;语句也可以返回不同的值。
发布于 2011-11-22 17:40:03
这不会被javac优化,也不会像你建议的那样被JVM优化。可以发生的事情是内联,然后是优化。
例如:
arg.getThing().method1();
arg.getThing().method2();变成了
Thing a = arg.thing;
a.method1();
Thing b = arg.thing;
a.method2();变成了
Thing a = arg.thing;
// expands a.method1(); doesn't update arg.thing.
Thing b = arg.thing;
// expands b.method2();变成了
Thing a = arg.thing;
// expands a.method1(); doesn't update arg.thing.
// expands a.method2();当内联足够的代码来确定这样做是安全的时,就消除了对thing的重复查找。通常,除非所有的方法都是微不足道的,否则这种情况不会发生(也不会有太大不同)。
如果getThing是一个昂贵或复杂的操作,它不太可能被优化,你最好自己缓存结果。(因为JIT不太可能确定其缓存值的安全性)
发布于 2011-11-22 17:37:47
我会发现,如果任何一种具有非副作用的函数的语言能够将一个函数的多次调用优化为一个函数,那将是非常令人惊讶的。如果getThing()存储了一些东西(例如,它被访问了多少次),该怎么办?编译器还能分辨出来吗?
https://stackoverflow.com/questions/8224586
复制相似问题