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

时间:2015-09-04 17:41:04

标签: java performance instance-variables local-variables

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

var readMore = "read about the solution...";
var readLess = "hide full description...";
var excerptState = true;
//".toggleExcerpt" is an empty <button> in the HTML

$(".toogleExcerpt").html(readMore);

$(".toogleExcerpt").click(function () {

    $(this).html( excerptState ? readLess : readMore );

    // invert state
    excerptState = !excerptState
});

在我看来,通过声明参考&#34; bs&#34;代码可以更快地运行在渲染方法之外所以它不是每一帧都重新创建的,但后来我实际上自己测试过,发现情况正好相反。

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

运行几次之后,很明显loop1的平均时间长了一个数量级。简单地说,访问实例字段所需的时间比创建新变量要长。我错过了什么,还是那么简单?如何才能了解哪些等效操作需要更长时间才能更好地优化代码?

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);
    }
}

有几次跑步。我的基准测试不正确吗?

1 个答案:

答案 0 :(得分:4)

设置局部变量要快得多,尤其是当它没有做任何事情时。您的时间是JIT检测和优化代码需要多长时间。如果你将循环的长度加倍,你将会发现它不会花费更长的时间。

当您设置静态变量时,JIT很难对其进行优化。