2016-01-22 64 views
4

因此,我一直在玩並行運行流,並根據API文檔和我已閱讀的其他支持材料監視其行爲。無序和並行時的Java流限制和跳過行爲

我創建了兩個並行流並運行distinct(),其中一個流是有序的,另一個是無序的流。然後我使用forEachOrdered()打印結果(爲了確保我看到在不同運行後得到的流的碰撞順序),並且可以清楚地看到無序版本不保持原始排序,但是對於大數據集,顯然會增強並行性能。

有API的筆記表明limit()skip()操作也應並行更有效地運行時,流無序的,而不是來取得前n元素,你可以得到任何n元素。我試圖用與上面相同的方式來模擬這個,但是與有序流和無序流並行運行的結果總是相同的。換句話說,當我在運行限制後打印出結果時,即使對於無序(並行)流,它仍然始終選擇前n個元素?

任何人都可以解釋這一點嗎?我嘗試改變我的輸入數據集的大小和n的值,並沒有什麼區別。我會認爲它會抓住任何n個元素並針對並行性能進行優化?有沒有人在實踐中看到過這種情況,並且可能會提供一種能夠持續顯示此行爲的解決方案?

回答

3

你可能試圖從SIZED/SUBSIZED源創建流(如arrayList.stream()Arrays.stream(array)IntStream.range()等),並立即發出limitskip操作。此實例在limit/skip實現中(見SliceOps)進行了特別優化,並且對於有序和無序流(實際運行速度非常快)以相同的速度運行。如果您刪除了這些特徵(例如,添加過濾步驟),您將看到在此之後使流無序是非常有用的。寫測試是這樣的:

input.stream().parallel().filter(x -> true).skip(..)... 
input.stream().parallel().unordered().filter(x -> true).skip(..)... 
input.stream().parallel().filter(x -> true).limit(..)... 
input.stream().parallel().unordered().filter(x -> true).limit(..)... 

另外,您可以與非SUBSIZED源(例如,TreeSetHashSet)測試。