-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()中不花费时间。 –