访问实例字段比声明局部变量需要更长的时间?

Accessing instance field takes longer than declaring local variables?

我正在观看有关 Java 游戏编程基础的视频,看到了这段代码

private void render() {
    BufferStrategy bs = getBufferStrategy();
    if (bs == null){
        createBufferStrategy(3);
        return;
    }
}

在我看来,通过在渲染方法之外声明引用 "bs",代码会 运行 更快,这样它就不会在每一帧都重新创建,但后来我自己实际测试了它发现恰恰相反。

package test;

public class tm {
    static String s;

    public static void loop1(){
        s = "hi";
    }

    public static void loop2(){
        String d;
        d = "hi";
    }
    public static void main(String[] args) {

        long x1 = System.nanoTime();
        for(int i = 0;i<100000;i++)
            loop1();
        long x2 = System.nanoTime();
        for(int i = 0;i<100000;i++)
            loop2();
        long x3 = System.nanoTime();

        System.out.println(x2-x1);
        System.out.println(x3-x2);
    }
}

经过 运行 几次之后,很明显 loop1 平均花费了一个数量级的时间。简单地访问实例字段比创建新变量花费的时间更长,这似乎违反直觉。我错过了什么还是这么简单?我如何了解哪些等效操作需要更长的时间,以便更好地优化我的代码?

1937701
284818

2036061
599144

3189017
675694

1971058
608125

有几个 运行。我的基准测试有误吗?

设置局部变量要快得多,尤其是当它什么都不做时。您正在计时的是 JIT 检测和优化代码所需的时间。你会发现,如果你将循环的长度加倍,它不会花费更长的时间。

当您设置静态变量时,JIT 很难将其优化掉。