有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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上的运行时是否有任何积极的性能影响


共 (3) 个答案

  1. # 1 楼答案

    像大多数问题一样,你应该首先考虑清楚,其次是表现。使代码清晰、简单,它很可能表现得相当好

    就清晰性而言,主要优势在于明确说明您在方法中没有使用this。这可以使重构方法变得更容易

    正如@OceanLife提到的,应该避免使用可变静态字段。静态字段类似于单例,它们更难进行单元测试并使线程安全

    虽然我会尽可能使方法static,但我会避免使用static字段,除非它们是不可变的

    在方法上使用static有两个概念上的性能优势

    • 这意味着在堆栈上传递的对象少了一个
    • 无法覆盖它,因此它不是“虚拟的”

    事实上,JIT可以优化大部分差异,但由于您的代码已经运行到可以优化的程度,所以它可能会产生微小的差异

    顺便说一句,运行足够优化的代码将带来很大的不同

  2. # 2 楼答案

    我没有尝试过对这个场景进行任何基准测试,但是使用static键盘(尤其是在使用javame/Android开发时)对性能有积极的影响。一些估计讨论了由于内联和所谓的预热期之后的re-JIT'ing导致的20%执行速度提升

    也就是说,有状态静态方法是不好的。最近,重量级的Google/Square开发者一直在和wider community讨论这个问题

  3. # 3 楼答案

    如果将invokestaticjvm指令与invokevirtualinvokeinterface指令进行比较,您会发现invokestatic应该更快。与invokevirtual相比,该方法只在静态方法列表(较小)中查找,而忽略了类层次结构。invokeinterface做了更多的工作,因为它无法优化方法查找(因此是所有方法中最慢的)