首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

從命令式到 Fork/Join 再到 Java 8 並行 Streams:方差計算效能實測

     編輯:Java 相關知識

三種風格計算方差

方差 = 平均[(x - 平均值)²]。數據:40,30,50,80 → 平均 50 → 方差 350。

1. 命令式(Imperative)

public static double varianceImperative(double[] pop) {
    double avg = 0;
    for (double p : pop) avg += p;
    avg /= pop.length;
    double var = 0;
    for (double p : pop) var += (p-avg)*(p-avg);
    return var / pop.length;
}

狀態修改、順序迭代,適配單核 CPU。

2. Fork/Join 框架(Java 7)

public class ForkJoinCalculator extends RecursiveTask {
    static final long THRESHOLD = 1_000_000;
    // ... 遞歸分割數組,子任務 fork/join,最後聚合
}

手動管理任務分割、同步、聚合,代碼量大、除錯難。

3. 並行 Streams(Java 8)

public static double varianceStreams(double[] pop) {
    double avg = Arrays.stream(pop).parallel().average().orElse(0);
    double var = Arrays.stream(pop).parallel()
        .map(p -> (p-avg)*(p-avg))
        .sum() / pop.length;
    return var;
}

聲明式:描述「做什麼」而非「怎麼做」。庫自動優化並行。注意:Stream 只能消費一次,需重新創建。

基準測試結果(3000 萬數據,4 核 i7,JDK 8 ea)

版本耗時
命令式60 ms
Fork/Join22 ms
並行 Streams46 ms

效能對比柱狀圖

分析

  • Fork/Join 最快,但開發成本最高。
  • 並行 Streams 略慢於 Fork/Join,但代碼極簡潔、可讀性強、自動優化潛力大。
  • 命令式在單核尚可,多核下無法利用硬體。

結論:Java 8 Streams API 讓並行編程普及化,聲明式風格開啟庫級優化大門。

作者:Raoul-Gabriel Urma 等,《Java 8 in Action》節選

出處:bianceng.cn

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved