ホームページ  >  記事  >  Java  >  パフォーマンスが重要なシナリオでは、Java 8 の Streams API は従来のコレクションよりも高速ですか?

パフォーマンスが重要なシナリオでは、Java 8 の Streams API は従来のコレクションよりも高速ですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-03 10:22:29335ブラウズ

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

Java 8: ストリームとコレクションのパフォーマンス分析

Java 8 に最近導入されたストリーム API のパフォーマンスを従来のコレクション アプローチと比較して評価する開発者にとって重要な側面です。洞察を提供するために、最初のベンチマークが実施されました。その結果、これら 2 つの方法の比較有効性について疑問が生じました。

ベンチマークの設定と結果

ベンチマークには、かなりの量のフィルタリングが含まれていました。整数のリストと偶数の平方根を計算し、結果を 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 のストリームは、従来のコレクションと比較して、コーディングの利便性とパフォーマンスの向上の両方を提供すると結論付けています。ストリームが常に優れているわけではありませんが、ストリームを使用するとコードが大幅に簡素化され、多くのシナリオで効率が向上します。

ベスト プラクティス

ストリームの利点を効果的に活用するには、次の点を考慮してください。以下のベストプラクティス:

  • 簡潔さと効率性のためにインライン ラムダ式を使用します。
  • 不必要な中間リストを避け、ターゲット コレクションを直接使用することに重点を置きます。
  • 特定のパフォーマンスを最適化するための並列ストリーム機能を検討します。状況。

以上がパフォーマンスが重要なシナリオでは、Java 8 の Streams API は従来のコレクションよりも高速ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。