爲了檢查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測量在方法上並不是那麼糟糕。 –