我在不同版本的Java中运行了以下程序。
final double[] values = new double[10000];
final long start = System.currentTimeMillis();
double sum = 0;
for (int i = 0; i < values.length; i++)
sum += Math.pow(values[i], 2);
final long elapsed = System.currentTimeMillis() - start;
System.out.println("Time elapse :: " + elapsed);
Java 7:输出
时间流逝:: 1
Java 8:输出
时间流逝:: 7
为什么Java 8中的性能问题与7相比?
答案 0 :(得分:5)
首先,您的基准测试缺乏任何预热。这是一些更现实的基准代码:
public class Test
{
public static void main(String[] args) {
final Random rnd = new Random();
for (int i = 0; i < 20; i++) {
final double[] values = new double[10000];
for (int j = 0; j < values.length; j++)
values[j] = rnd.nextDouble();
testPow(values);
}
}
private static void testPow(double[] values) {
final long start = System.nanoTime();
double sum = 0;
for (int i = 0; i < values.length; i++)
sum += Math.pow(values[i], 2);
final long elapsed = System.nanoTime() - start;
System.out.println("Sum: " + sum + "; Time elapse :: " + TimeUnit.NANOSECONDS.toMillis(elapsed));
}
}
我在Java 8上运行它,它为 100万个元素提供了9毫秒。在Java 6上,它给出了62毫秒。 (对不起,我没有安装JDK 7.)
另一方面,如果我没有初始化数组(就像你没有那样),那么对于百万个元素我得到0.9毫秒,而Java 6则保持不变。
要重现您的观察结果,只需从第一次运行中获取结果,然后将它们与稍后发生的改进进行比较。数组越小,在触发给定优化之前,到达最内层循环的迭代次数达到JIT编译器所需的重复次数就越多。