性能说明:预热后代码运行速度较慢
下面的代码运行完全相同的计算3次(它没有做太多事情:基本上将1到100m的所有数字相加)。前 2 个方块的运行速度比第三个区块快约 10 倍。我已经运行了这个测试程序超过10次,结果显示差异很小。
如果有的话,我希望第三个块运行得更快(JIT编译),但典型的输出是:
35974537
36368455
296471550
有人能解释一下发生了什么吗?(为了清楚起见,我不是想在这里修复任何东西,只是想更好地了解发生了什么)
注意:
- 在程序期间不运行GC(监控
-XX:+PrintGC
) - 使用 Oracle JDK 版本 1.6.0_30、1.7.0_02 和 1.7.0_05 进行了测试
- 还使用以下参数进行了测试:=>相同的结果
-XX:+PrintGC -Xms1000m -Xmx1000m -XX:NewSize=900m
- 相反,块被放入循环中,所有运行都很快
- 如果将块提取到方法中,则所有运行都很快(无论该方法被调用3次还是在循环中都没有区别)
public static void main(String... args) {
//three identical blocks
{
long start = System.nanoTime();
CountByOne c = new CountByOne();
int sum = 0;
for (int i = 0; i < 100000000; i++) {
sum += c.getNext();
}
if (sum != c.getSum()) throw new IllegalStateException(); //use sum
long end = System.nanoTime();
System.out.println((end - start));
}
{
long start = System.nanoTime();
CountByOne c = new CountByOne();
int sum = 0;
for (int i = 0; i < 100000000; i++) {
sum += c.getNext();
}
if (sum != c.getSum()) throw new IllegalStateException(); //use sum
long end = System.nanoTime();
System.out.println((end - start));
}
{
long start = System.nanoTime();
CountByOne c = new CountByOne();
int sum = 0;
for (int i = 0; i < 100000000; i++) {
sum += c.getNext();
}
if (sum != c.getSum()) throw new IllegalStateException(); //use sum
long end = System.nanoTime();
System.out.println((end - start));
}
}
public static class CountByOne {
private int i = 0;
private int sum = 0;
public int getSum() {
return sum;
}
public int getNext() {
i += 1;
sum += i;
return i;
}
}