[英]What happens inside the JVM so that a method invocation in Java becomes slower when you call it somewhere else in your code?
[英]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);
}
RADIUS
是static
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.