首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中的局部引用优化

Java中的局部引用优化
EN

Stack Overflow用户
提问于 2011-11-22 17:33:13
回答 6查看 158关注 0票数 3
代码语言:javascript
复制
void myMethod(Object arg)
{
    arg.getThing().method1();
    arg.getThing().method2();
}

基本的Java6安装是否会将此优化为对访问器的单个调用(可能是通过将引用存储在本地)。我意识到如果有多个线程,优化器可能不得不避免这样做。对于几乎所有的Java 6 JVM,有没有常见的优化列表?

示例:

代码语言:javascript
复制
    {
       Object local = arg.getThing();
       local.method1();
       local.method2();
    }
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-11-22 17:37:56

我不期望javac编译器在这里进行任何优化,因为getThing()的值可能会随着时间和调用之间的不同而变化(例如,随机值、堆栈上的pop()操作或当前时间)。你明白了吧)。

如果发现getThing()方法总是返回相同的东西,也许JIT编译器可以对此进行优化,但我不会指望这一点。如果thing的值被另一个线程更改,即使是最简单的return thing;语句也可以返回不同的值。

票数 4
EN

Stack Overflow用户

发布于 2011-11-22 17:40:03

这不会被javac优化,也不会像你建议的那样被JVM优化。可以发生的事情是内联,然后是优化。

例如:

代码语言:javascript
复制
arg.getThing().method1();
arg.getThing().method2();

变成了

代码语言:javascript
复制
Thing a = arg.thing;
a.method1();
Thing b = arg.thing;
a.method2();

变成了

代码语言:javascript
复制
Thing a = arg.thing;
// expands a.method1(); doesn't update arg.thing.
Thing b = arg.thing;
// expands b.method2();

变成了

代码语言:javascript
复制
Thing a = arg.thing;
// expands a.method1(); doesn't update arg.thing.
// expands a.method2();

当内联足够的代码来确定这样做是安全的时,就消除了对thing的重复查找。通常,除非所有的方法都是微不足道的,否则这种情况不会发生(也不会有太大不同)。

如果getThing是一个昂贵或复杂的操作,它不太可能被优化,你最好自己缓存结果。(因为JIT不太可能确定其缓存值的安全性)

票数 2
EN

Stack Overflow用户

发布于 2011-11-22 17:37:47

我会发现,如果任何一种具有非副作用的函数的语言能够将一个函数的多次调用优化为一个函数,那将是非常令人惊讶的。如果getThing()存储了一些东西(例如,它被访问了多少次),该怎么办?编译器还能分辨出来吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8224586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档