为了验证一下JIT在执行时的优化,测试了一下下面的代码:
在我的机器上结果如下:
直接使用数据用时: 203
通过函数调用(一次)用时: 266
通过函数调用(二次)用时: 281
通过函数调用(final)用时: 281
通过函数调用(同步)用时: 7563
可以看出,同步(不管是否有竞争)的性能损失巨大。 内联的优化是自动的,加不加 final ,用处不大。
源代码如下,大家可以测试一下。
public class TestSpeed {
private int value = 10;
public int get() {
return value;
}
public int getJJ() {
return get();
}
public synchronized int get_sync() {
return value;
}
final public int get_final() {
return value;
}
public static void main(String[] args) {
TestSpeed ts = new TestSpeed();
int max = 1000*1000*100;
@SuppressWarnings("unused") int temp = 0;
SimpleTimer st = new SimpleTimer().start();
for (int i = 1; i < max; i++) {
temp = ts.value+1;
}
System.out.println("直接使用数据用时: "+st.end());
st = new SimpleTimer().start();
for (int i = 1; i < max; i++) {
temp = ts.get()+1;
}
System.out.println("通过函数调用(一次)用时: "+st.end());
st = new SimpleTimer().start();
for (int i = 1; i < max; i++) {
temp = ts.getJJ()+1;
}
System.out.println("通过函数调用(二次)用时: "+st.end());
st = new SimpleTimer().start();
for (int i = 1; i < max; i++) {
temp = ts.get_final()+1;
}
System.out.println("通过函数调用(final)用时: "+st.end());
st = new SimpleTimer().start();
for (int i = 1; i < max; i++) {
temp = ts.get_sync()+1;
}
System.out.println("通过函数调用(同步)用时: "+st.end());
}
}
class SimpleTimer {
long startTime = 0;
public SimpleTimer start() {
startTime = System.currentTimeMillis();
return this;
}
public long end() {
return System.currentTimeMillis() - startTime;
}
}