Java静态修饰符对运行时性能有积极影响吗?

时间:2015-01-08 22:43:56

标签: java performance jvm

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上的运行时有什么积极的性能影响吗?

3 个答案:

答案 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指令与invokevirtualinvokeinterface的比较,您会发现invokestatic应该更快。与invokevirtual相比,方法仅在静态方法列表(较小)中查找,并且忽略类层次结构。 invokeinterface做了更多的工作,因为它无法优化方法查找(因此它们都是最慢的)。