Java 8中的Math.pow性能与Java 7相比

时间:2015-08-04 09:33:43

标签: java performance math java-8

我在不同版本的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相比?

1 个答案:

答案 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编译器所需的重复次数就越多。