首頁 > Java > java教程 > 在效能關鍵場景中,Java 8 的 Streams API 是否比傳統 Collections 更快?

在效能關鍵場景中,Java 8 的 Streams API 是否比傳統 Collections 更快?

Mary-Kate Olsen
發布: 2024-11-03 10:22:29
原創
398 人瀏覽過

Is Java 8's Streams API faster than traditional Collections in performance-critical scenarios?

Java 8:Streams 與Collections 效能分析

評估Java 8 中最近引入的Streams API 與傳統Collections 方法相比的效能對於開發者來說是一個至關重要的方面。為了提供見解,進行了初步基準測試,這對這兩種方法的比較功效提出了疑問。

基準設定和結果

基準涉及過濾相當大的資料整數列表併計算偶數的平方根,將結果儲存在 Double 列表中。下面的程式碼片段說明了實作過程:

<code class="java">    // Source list initialization
    List<Integer> sourceList = new ArrayList<>();
    for (int i = 1; i < 1000000; i++) {
        sourceList.add(i);
    }

    // Collections approach
    List<Double> resultCollection = new LinkedList<>();
    long startTimeCollection = System.nanoTime();
    // Iterate through the list and perform calculations
    for (Integer i : sourceList) {
        if (i % 2 == 0) {
            resultCollection.add(Math.sqrt(i));
        }
    }
    long elapsedTimeCollection = System.nanoTime() - startTimeCollection;


    // Stream approach
    Stream<Integer> stream = sourceList.stream();
    long startTimeStream = System.nanoTime();
    // Filter even numbers and calculate square roots
    resultStream = stream.filter(i -> i % 2 == 0)
                        .map(i -> Math.sqrt(i))
                        .collect(Collectors.toList());
    long elapsedTimeStream = System.nanoTime() - startTimeStream;

    // Parallel stream approach
    stream = sourceList.stream().parallel();
    long startTimeParallelStream = System.nanoTime();
    resultParallelStream = stream.filter(i -> i % 2 == 0)
                                .map(i -> Math.sqrt(i))
                                .collect(Collectors.toList());
    long elapsedTimeParallelStream = System.nanoTime() - startTimeParallelStream;</code>
登入後複製

雙核心機器上的結果顯示:

  • 集合方法的執行速度明顯更快,大約需要 0.094 秒。
  • 流方法表現出較慢的性能,需要約 0.201 秒。
  • 平行流方法表現出與流方法類似的性能,在 0.357 秒內完成。

基準結果分析

根據這些初步發現,初步得出結論:流比集合慢,即使並行也無法提高性能。然而,所採用的基準測試方法引起了人們對潛在缺陷的擔憂。

改進的性能驗證

為了解決這些問題,基準測試進行了以下改進:

  • 執行:JVM 預熱後運行基準測試1,000 次以穩定性能。
  • 分析:使用 JMH(Java Microbenchmarking Harness)準確執行基準測試並收集效能資料。

更新的基準結果

修訂後的基準產生以下結果:

  • 集合方法:平均時間為0.207 秒
  • 流方法:平均時間為0.098 秒
  • 並行流方法:平均時間為0.168 秒

在這個修訂後的基準測試中,流的性能優於集合,這與最初的發現相反。流方法的更快執行時間可歸因於 JIT 最佳化和編譯器改進的程式碼產生。

結論

根據這些更新的發現,可以結論是,與傳統集合相比,Java 8 中的流提供了編碼便利性和效能增強。雖然串流並不總是很優越,但它們的使用可以在許多場景中顯著簡化程式碼並提高效率。

最佳實踐

要有效利用流的優勢,請考慮以下最佳實踐:

  • 使用內聯 lambda 表達式來簡潔和高效。
  • 避免不必要的中間列表,專注於直接使用目標集合。
  • 探索並行流功能以最佳化某些特定環境下的效能情況。

以上是在效能關鍵場景中,Java 8 的 Streams API 是否比傳統 Collections 更快?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板