-2
考慮到下面的完整源代碼,請解釋爲什麼Eclipse中此程序的每次執行結果爲time
,do1()
大於time
,do2()
2〜3毫秒。JVM - 速度性能問題
JVM是否需要「預熱」?
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.IntStream;
public class Question {
public static void main(String[] args) {
do1();
do2();
}
public static void do1() {
O obj = new O();
Thread t = new Thread(() -> IntStream.range(0, 100000)
.forEach(e -> obj.incrementN()));
long start = System.currentTimeMillis();
t.start();
try {
t.join();
} catch (InterruptedException e1) {
}
float time = (System.currentTimeMillis()-start)/1000F;
System.out.println(time);
System.out.println(obj);
System.out.println();
}
public static void do2() {
O obj = new O();
Thread t = new Thread(() -> IntStream.range(0, 100000)
.forEach(e -> obj.incrementN()));
long start = System.currentTimeMillis();
t.start();
try {
t.join();
} catch (InterruptedException e1) {
}
float time = (System.currentTimeMillis()-start)/1000F;
System.out.println(time);
System.out.println(obj);
}
}
class O {
private AtomicInteger n = new AtomicInteger(0);
public void incrementN() {
n.getAndIncrement();
}
@Override
public String toString() {
return ""+n.get();
}
}
輸出示例:
0.003
100000
0.001
100000
如果你這樣做了1000次,然後拿出平均結果,這樣會更準確。這可能只是隨機性。 – Gendarme
是的,JVM需要預熱,因爲大量使用的代碼通過JIT系統編譯爲本機代碼。 – Xvolks
它只是一次性的結果,平均可以給出更準確的結果。 它可以加載在do1()中完成一次的類O的時間,然後在do2()中不花費時間。 –