2017-10-09 85 views
-2

Java编译器是否优化,如果不是必要的话,不会创建新对象/引用?Java编译器是否优化,如果不需要则不会创建新对象/引用

例如

public class Foo { 

    public void foo(Object[] data) { 
     for(int i=0; i<data.length; i++) { 
      Object d = data[i];      // <-- here 
      bar(d); 
     } 
    } 

    private void bar(Object o) { 
     //... 
    } 

} 

是一样的:

public class Foo { 

    public void foo(Object[] data) { 
     for(int i=0; i<data.length; i++) { 
      bar(data[i]);       // <-- and here 
     } 
    } 

    private void bar(Object o) { 
     //... 
    } 

} 

运行

+6

这两个片段中都没有涉及对象的创建......保存的唯一东西(是的,可能是最优化的)是局部变量。要查看编​​译器是否实际生成相同的代码,请查看字节码。 – Fildor

回答

2

这是一个非常复杂的话题,有什么java编译器优化和它做什么不是。

当你与javac编译代码,它基本上是优化任何东西,除了一些非常小的碎片。它的叶子它触及所以JIT compiler具有在运行时更好的知识。因此看字节码并不是很有用。

当你的代码变得hot所以它标志着由JIT优化时,它被称为足够的时间,复杂的优化执行。有人说JIT优化的代码可以快20倍。根据整个来龙去脉,从这个问题你的代码可以变成完全不同的东西,如果JIT决定的话,它的执行,甚至可以跳过。 JIT绝对能够完成你所要求的优化,而且远不止于此。

+0

换句话说编译成字节码没有中进行了优化 - 是吗? – THM

+0

有些事情已经完成:像内联静态决赛,计算已知表达式和字符串字面连接,切换语句。另外,在Java 9中,旧字符串连接被替换为“StringConcatFactory”的新用法。这些并不是真正的优化本身,只是一些可以完成而没有任何缺点的事情。 – Shadov