【发布时间】:2016-03-02 21:53:27
【问题描述】:
我正在运行一些测试(非常基础,没什么花哨的),以检查 Java 8 流和 lambda 的性能。使用 1000 万个 POJOS 的 ArrayList,我要做的就是获取 BigDecimal 字段的平均值。为了采集多个样本,我运行了五次该过程,令我惊讶的是,这五次运行中的第一次比其他运行慢得多。我第一次得到的值是 0.38 秒,其他四个是 0.04 秒。这快了 10 倍!!!我还使用老派for(Pojo p : pojos) 进行了相同的测试,结果相似。为什么会发生这种情况,我该如何利用它?我使用的代码是:
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 框架。
-
我不同意重复标记。 OP 询问为什么第一个处理速度较慢。确实如此。即使 OP 使用 JMH 重写基准,第一次迭代也会比后续迭代慢得多。考虑到我们所说的是几十毫秒,而不是微秒或纳秒,OPs 测量在方法上并不是那么糟糕。
标签: performance java-8 java-stream