访问实例字段比声明局部变量需要更长的时间?
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 很难将其优化掉。
我正在观看有关 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 很难将其优化掉。