繁体   English   中英

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

[英]Will java compiler optimize a method call on a final static variable ? And what happens when it becomes dalvik code?

我有以下代码

 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);
    }

RADIUSstatic final float

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

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

Java编译器不会对该代码执行任何操作。

HotSpot JVM几乎可以肯定会预先计算平方(RADIUS)。

Android没有特定的JVM。

我个人根本不会编写square()方法,只return (cx-x)*(cx-x)+(cy-y)*(cy-y) < RADIUS*RADIUS; 并让编译器/ JVM从那里开始战斗。 但后来我是一个数学家;-)

Dalvik JIT编译器实际上执行内联短函数,例如问题中定义的square() (尽管将其声明为static可能更好)。 但是,我无法立即告诉您它是否一定会内联。

如果重要,请分析代码!

据我所知,Java的优化是由HotSpot编译器在运行时完成的(字节码在转换为机器代码时已得到优化)。 因此,答案是肯定的。

转换后的代码将同样进行优化,但是取决于JVM,它将如何处理。 根据我的经验,它高度依赖JVM,并可能取决于其设置(优化程序的积极性)。 我试图比较SHA1与循环的运行情况,而在Windows JVM和Linux上则没有。 在一种情况下,没有循环的代码快很多倍,在第二种情况下(我认为在Linux上),相差仅40%的时间...

所以这是一种魔术,您可能会为HotSpot提供优化或配置JVM的良好提示,但是仍然取决于当前JVM的算法...

唯一会发生的优化是,编译器很可能会将静态的final字段的值“常量”为访问它的常量,而不是在运行时执行字段查找。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM