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;
}
}
在上面的代码中,变量static
和方法b
上的computeB()
修饰符对JVM上的运行时有什么积极的性能影响吗?
答案 0 :(得分:5)
像大多数这些问题一样,你应该首先考虑清晰度,然后将表现放在第二位。使代码清晰简单,并且可能表现得相当好。
就清晰度而言,主要优点是明确表示您未在方法中使用this
。这可以使重构方法更容易。
正如@OceanLife所提到的,应避免使用可变静态字段。静态字段就像单例,它们更难以进行单元测试并使线程安全。
虽然我尽可能制作方法static
,但我会避免使用static
字段,除非它们是不可变的。
在方法上使用static
有两个名义上的性能优势
实际上,JIT可以优化大部分差异,但由于您的代码运行得足以进行优化,因此可以产生很小的差异。
BTW运行你的代码足以进行优化会产生更大的差异。
答案 1 :(得分:1)
我还未尝试对此方案进行任何基准测试,但使用static
键盘(尤其是使用Java ME / Android进行开发时)会对性能产生积极影响。一些估计讨论了由于内联而导致的执行速度提高20%以及随后的re-JIT'ing 所谓的'热身'周期。
那就是说,有状态的静态方法很糟糕。最近,Google / Square开发人员一直在与wider community进行讨论。
答案 2 :(得分:0)
如果比较invokestatic jvm指令与invokevirtual或invokeinterface的比较,您会发现invokestatic应该更快。与invokevirtual相比,方法仅在静态方法列表(较小)中查找,并且忽略类层次结构。 invokeinterface做了更多的工作,因为它无法优化方法查找(因此它们都是最慢的)。