java编译器会优化对最终静态变量的方法调用吗?当它成为dalvik代码时会发生什么?

Gau*_*tam 5 java android javac dalvik compiler-optimization

我有以下代码

 float square(float val) { return val*val;}
 boolean isInCircle(final float x,final float y) {

        float squareDistance = square(cx - x) + square(cy - y);
        return squareDistance < square(RADIUS);
    }
Run Code Online (Sandbox Code Playgroud)

这里RADIUS是一个static final float.

java编译器会优化调用square(RADIUS)吗?

转换为dalvik代码时会发生什么android?它会保持优化吗?

mal*_*ouk 1

Java 中的优化(据我所知)是由HotSpot 编译器在运行时完成的(字节码在转换为机器代码时进行了优化)。所以答案是肯定和否定。

转换后的代码将同样得到优化,但这取决于 JVM,将如何处理它。根据我的经验,它高度依赖于 JVM 并且可能依赖于它的设置(优化器的主动性)。我尝试比较 SHA1 在 Windows JVM 和 Linux 上的带循环和不带循环的运行。在一种情况下,没有循环的代码要快很多倍,而在第二种情况下(我认为在 Linux 上),只有大约 40% 的时间差异......

所以这是一个魔法,你可能会给 HotSpot 很好的优化提示,或者配置 JVM,但是,这仍然取决于 JVM 的当前算法......

  • @GautamK:*几乎*零。与编译时常量表达式相关的优化非常有限。基本上,如果编译器可以“保证”表达式的值,那么它将用预先计算的结果替换它。例如 `int i = 2*3;` 将编译为与 `int i = 6;` 相同的字节码(请参阅 [JLS §15.28](http://docs.oracle.com/javase/specs/jls/se7 /html/jls-15.html#jls-15.28))。 (2认同)