Java 8 流性能對比。傳統集合
您最近涉足 Java 8 並進行了非正式基準測試,以將其 Stream API 與經典集合的性能進行比較。您的測試涉及過濾整數列表、提取偶數的平方根並將結果儲存在 Double 列表中。然而,您質疑測試的有效性,並渴望澄清真正的效能影響。
評估基準測試
您的初步結果,表明流比收集慢,引發了擔憂。為了確保更可靠的評估,必須解決潛在的錯誤並進行公平的測試。以下是一些注意事項:
正確的基準測試結果
根據這些建議,讓我們重新檢視使用JMH 和改進的基準測試策略進行效能評估:
@OutputTimeUnit(TimeUnit.NANOSECONDS) @BenchmarkMode(Mode.AverageTime) @OperationsPerInvocation(StreamVsVanilla.N) public class StreamVsVanilla { public static final int N = 10000; static List<Integer> sourceList = new ArrayList<>(); static { for (int i = 0; i < N; i++) { sourceList.add(i); } } @Benchmark public List<Double> vanilla() { List<Double> result = new ArrayList<>(sourceList.size() / 2 + 1); for (Integer i : sourceList) { if (i % 2 == 0){ result.add(Math.sqrt(i)); } } return result; } @Benchmark public List<Double> stream() { return sourceList.stream() .filter(i -> i % 2 == 0) .map(Math::sqrt) .collect(Collectors.toCollection( () -> new ArrayList<>(sourceList.size() / 2 + 1))); } }
結果:
Benchmark Mode Samples Mean Mean error Units StreamVsVanilla.stream avgt 10 17.588 0.230 ns/op StreamVsVanilla.vanilla avgt 10 10.796 0.063 ns/op
結果
與此特定場景中,傳統收集方法明顯快於流方法。
結論
基於這些改進的基準測試結果,我們可以得出結論:
以上是對於簡單的操作,流總是比傳統集合慢嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!