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



我正在看一个关于基本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很难将其优化掉。

相关内容

  • 没有找到相关文章

最新更新