2017-07-18 93 views
-2

與地圖流功能的這兩個用途的性能差異說我有功能mutateElement()這確實X操作和mutateElement2()這確實ý操作。這兩段代碼在性能上有什麼不同?什麼是在Java 8

Piece1:

List<Object> = array.stream().map(elem -> 
    mutateElement(elem); 
    mutateElement2(elem); 
) 
.collect(Collectors.toList()); 

Piece2:

List<Object> array = array.stream().map(elem -> 
    mutateElement(elem); 
) 
.collect(Collectors.toList()); 

array = array.stream().map(elem -> 
    mutateElement2(elem); 
) 
.collect(Collectors.toList()); 

顯然,第一個實現是更好,因爲它僅使用一個迭代器,但第二個使用兩個迭代器。但是,如果我已經說出數百萬個元素,這種差異是否會顯着。

回答

2
  1. 第一個實現不是更好,因爲它只使用一個迭代器,第一個實現更好,因爲它只收集一次。

  2. 沒有人可以告訴你,如果您有一百萬個元素,差異是否會顯着。 (如果有人試圖告訴你,你不應該相信他們。)基準測試。

1
無論你使用流還是外環

,問題是一樣的。
在第一個代碼中List的一次迭代和第二個代碼中List的兩次迭代。
執行第二個代碼的時間在邏輯上是非常重要的。

除了在流上調用兩次終端操作:

.collect(Collectors.toList()); 

而不是一次,也具有成本。

但是,如果我在數組中說了一百萬個元素 ,那麼差異是否會顯着?

它可能是。
現在的問題很難回答:是或否。
它取決於其他參數,如cpus,併發用戶數量和處理以及「明顯」的定義。