我有以下代码
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);
}
其中RADIUS
是static
final
float
。
java编译器会优化调用square(RADIUS)
吗?
当转换为dalvik
的{{1}}代码时会发生什么?它会保持优化吗?
答案 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)
唯一的优化是编译器很可能将静态最终字段的值“实际”作为访问它的常量“实习”,而不是在运行时执行字段查找。