5

我有以下代码

 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代码时会发生什么android?它会保持优化吗?

4

4 回答 4

3

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

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

Android 没有那个特定的 JVM。

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

于 2012-07-12T06:31:31.277 回答
2

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

如果重要,请分析代码!

于 2012-07-16T16:02:26.683 回答
1

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

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

所以这很神奇,你可以给 HotSpot 很好的提示来优化或配置 JVM,但仍然取决于 JVM 的当前算法......

于 2012-07-12T06:31:29.077 回答
-1

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

于 2012-07-12T17:35:28.647 回答