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

时间:2012-07-12 06:17:38

标签: java android javac compiler-optimization dalvik

我有以下代码

 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)吗?

当转换为dalvik的{​​{1}}代码时会发生什么?它会保持优化吗?

4 个答案:

答案 0 :(得分:3)

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

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

Android没有那个特定的JVM。

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

答案 1 :(得分:2)

Dalvik JIT编译器实际上实现了内联短函数,例如问题中定义的square()(尽管可能更好地声明它static)。但是,我无法告诉你它是否肯定会被内联。

如果重要,请对代码进行描述!

答案 2 :(得分:1)

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

转换后的代码将同样优化,但它依赖于JVM,它将如何处理它。根据我的经验,它高度依赖于JVM,可能还有它的设置(优化器的攻击性)。我试图将SHA1的运行与循环进行比较,而不是在Windows JVM和Linux上运行。在一个案例中,没有循环的代码快了很多倍,在第二种情况下(我认为在Linux上)只有大约40%的时间差异......

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

答案 3 :(得分:-1)

唯一的优化是编译器很可能将静态最终字段的值“实际”作为访问它的常量“实习”,而不是在运行时执行字段查找。