2017-08-16 26 views
0

我讀了「何時使用並行流?」 DougLea等人http://gee.cs.oswego.edu/dl/html/StreamParallelGuidance.html順序流的性能

我想知道有沒有人有指導路線(do/do dos)/觀察他們認爲舊的編碼方式在某些情況下比順序流更好嗎? 我發現了一個在這裏https://jaxenter.com/java-performance-tutorial-how-fast-are-the-java-8-streams-118830.html

我知道這是一個抽象的問題,但是這將是有益的,如果有人可以在序列流的性能分享他們的經驗和Java 7的方式

回答

1

我這只是前幾天做;我們不得不總結一個非常大陣,想知道什麼是做的最快方法 - 所以我測(不用猜,我用jmh):

@State(Scope.Thread) 
public static class Holder { 

    @Param({ "1000", "10000", "50000", "100000", "1000000" }) 
    public int howManyEntries; 

    int array[] = null; 

    @Setup 
    public void setUp() { 
     array = new int[howManyEntries]; 
     for (int i = 0; i < howManyEntries; ++i) { 
      array[i] = i; 
     } 
    } 

    @TearDown 
    public void tearDown() { 
     array = null; 
    } 
} 

@Fork(1) 
@Benchmark 
public int iterative(Holder holder) { 

    int total = 0; 
    for (int i = 0; i < holder.howManyEntries; ++i) { 
     total += holder.array[i]; 
    } 

    return total; 
} 

@Fork(1) 
@Benchmark 
public int stream(Holder holder) { 
    return Arrays.stream(holder.array).sum(); 
} 

@Fork(1) 
@Benchmark 
public int streamParallel(Holder holder) { 
    return Arrays.stream(holder.array).parallel().sum(); 
} 

獲獎者是總是老式的java-7方式。

// 1000=[iterative, stream, streamParallel] 
// 10000=[iterative, stream, streamParallel] 
// 50000=[iterative, stream, streamParallel] 
// 100000=[iterative, stream, streamParallel] 
// 1000000=[iterative, stream, streamParallel] 

即使是100萬個元素。但是,結果在60毫秒之內會有所不同 - 如果您咬住或不咬住您完全是您的選擇。

流不是爲了速度,它們不會替代舊式,他們也不想 - 例如它可以爲代碼增加額外的可見性。

+0

感謝您分享。我理解了流式提供的代碼可讀性。現在有一天,我傾向於以流的方式來寫所有的東西,但在反思中我發現我應該在某個地方使用舊的風格以獲得更好的表現。這就是爲什麼我正在尋找現實生活中做的事,不要做 – nantitv

+1

@nantitv我會讓你的痛苦變得誠實;但是關於代碼更具可讀性的部分對我來說已經變得如此之大 - 我真的很難用流讀取java-8之前的代碼,即使是那些毫秒也無法完成它......當然,這並不重要(速度損失),直到它確實 - 可能就是你被「擊中」...... – Eugene