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