为了检查Java 8流和lambdas上的性能,我正在运行一些测试(非常基本,没什么奇怪的)。使用1000万POJOS中的一个ArrayList
,我所要做的就是获得BigDecimal
字段的平均值。为了取得多于一个样本,我运行了这个过程五次,令我吃惊的是这五次运行中的第一次比其他运行慢得多。我第一次获得的值是0.38秒,其他四个则是0.04秒。这比快10倍!我也使用旧学校for(Pojo p : pojos)
做了相同的测试,结果类似。为什么会发生这种情况,我该如何利用它?我正在使用的代码是:Java 8,首次处理列表比后续处理慢
for (int i = 0; i < 5; i++) {
long init = System.nanoTime();
BigDecimal sum = lista.parallelStream().map(x -> x.getCosto()).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal avg = sum.divide(BigDecimal.valueOf(registros));
long end = System.nanoTime();
System.out.println("End of processing: " + avg + " in "
+ ((end - init)/1000000000.0) + " seconds.");
}
不幸的是,进行性能测试并不容易,尤其是在与lambda表达式和方法引用结合使用时。你需要使用适当的工具,比如JMH框架。 – Tunaki
我不同意重复标记。 OP询问为何第一次处理速度较慢。事实确实如此。即使OP使用JMH重写了基准,第一次迭代将比后续迭代慢得多。考虑到我们讲几十毫秒,而不是微秒或纳秒,OPs测量在方法上并不是那么糟糕。 –