Java静态修饰符对运行时性能有积极影响吗?
public class A {
private int a;
private static int b;
public A(int num) {
this.a = num;
this.b = num;
// which one is quickest?
this.computeA();
this.computeB();
}
public int computeA() {
return this.a * this.a;
}
public static int computeB() {
return b * b;
}
}
在上面的代码中,变量b
和方法computeB()
上的static
修饰符对JVM上的运行时是否有任何积极的性能影响
# 1 楼答案
就清晰性而言,主要优势在于明确说明您在方法中没有使用
this
。这可以使重构方法变得更容易正如@OceanLife提到的,应该避免使用可变静态字段。静态字段类似于单例,它们更难进行单元测试并使线程安全
虽然我会尽可能使方法
static
,但我会避免使用static
字段,除非它们是不可变的在方法上使用
static
有两个概念上的性能优势事实上,JIT可以优化大部分差异,但由于您的代码已经运行到可以优化的程度,所以它可能会产生微小的差异
顺便说一句,运行足够优化的代码将带来很大的不同
# 2 楼答案
我没有尝试过对这个场景进行任何基准测试,但是使用
static
键盘(尤其是在使用javame/Android开发时)对性能有积极的影响。一些估计讨论了由于内联和所谓的预热期之后的re-JIT'ing导致的20%执行速度提升也就是说,有状态静态方法是不好的。最近,重量级的Google/Square开发者一直在和wider community讨论这个问题
# 3 楼答案
如果将invokestaticjvm指令与invokevirtual或invokeinterface指令进行比较,您会发现invokestatic应该更快。与invokevirtual相比,该方法只在静态方法列表(较小)中查找,而忽略了类层次结构。invokeinterface做了更多的工作,因为它无法优化方法查找(因此是所有方法中最慢的)