鉴于下面的完整源代码,请解释为什么Eclipse中此程序的每次执行导致time
中的do1()
大于time
do2()
中的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();
}
}
2~3毫秒。
JVM是否需要“预热”?
0.003
100000
0.001
100000
示例输出:
<?php
return [
'default' => 'mysql',
'connections' => [
'mysql' => [
'driver' => 'mysql',
'host' => 'localhost',
'database' => 'homestead',
'username' => 'root',
'password' => 'secret',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
],
'mysql2' => [
'driver' => 'mysql',
'host' => 'localhost',
'database' => 'homestead2',
'username' => 'root',
'password' => 'secret',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
],
],
答案 0 :(得分:0)
这确实是一个太短的时间跨度来真正确定导致do1()执行的时间长于do2()的原因。
有些因素可能是:
垃圾收集器踢(例如,创建了你的o和t对象,当方法do1()离开时,指向其内存位置(在堆栈上)的指针被销毁,但内存本身被释放垃圾收集器)
Eclipse在两者之间做某些分析(测量变量,时间或某些东西)
正如你的建议,JVM也可以做一些预热。
不幸的CPU调度。无论出于何种原因,do1()可能比do2()获得更多的CPU时间
你可以在调用do1()(或sleep)之前做一些事情,然后调用do1(),然后再次等待并调用do2()并再次测量。或者你可以增加do1()和do2()消耗的时间。
另外,你的do1()和do2()方法(除了do1()中的名称和println完全相同,那么当你只调用do1()2次时会发生什么?