ホームページ  >  記事  >  Java  >  単純な操作の場合、ストリームは常に従来のコレクションよりも遅いですか?

単純な操作の場合、ストリームは常に従来のコレクションよりも遅いですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-03 17:46:02895ブラウズ

Are Streams Always Slower Than Traditional Collections for Simple Operations?

Java 8 ストリームのパフォーマンスと従来のコレクション

あなたは最近 Java 8 に挑戦し、そのストリーム API のパフォーマンスを従来のコレクションと比較する非公式のベンチマークを実施しました。テストには、整数のリストをフィルター処理し、偶数の平方根を抽出し、結果を Double リストに保存することが含まれます。しかし、あなたはテストの妥当性を疑問視しており、実際のパフォーマンスへの影響を明らかにしたいと考えています。

ベンチマーク テストの評価

ストリームを示した最初の結果コレクションよりも遅いという懸念が生じました。より信頼性の高い評価を保証するには、潜在的なエラーに対処し、公正なテストを実施することが不可欠です。

  • LinkedList の使用: LinkedList は効率的なランダム アクセスが欠けているため、結果リストとして最適な選択肢ではありません。代わりに ArrayList の使用を検討してください。
  • ベンチマーク方法: 手動ベンチマークは不正確になりやすい可能性があります。 JMH (Java Microbenchmarking Harness) などのベンチマーク フレームワークを利用して、より正確で信頼性の高い測定を提供します。

適切なベンチマーク結果

これらの推奨事項に従って、 JMH を使用したパフォーマンス評価と改善されたベンチマーク戦略:

@OutputTimeUnit(TimeUnit.NANOSECONDS)
@BenchmarkMode(Mode.AverageTime)
@OperationsPerInvocation(StreamVsVanilla.N)
public class StreamVsVanilla {
    public static final int N = 10000;

    static List<Integer> sourceList = new ArrayList<>();
    static {
        for (int i = 0; i < N; i++) {
            sourceList.add(i);
        }
    }

    @Benchmark
    public List<Double> vanilla() {
        List<Double> result = new ArrayList<>(sourceList.size() / 2 + 1);
        for (Integer i : sourceList) {
            if (i % 2 == 0){
                result.add(Math.sqrt(i));
            }
        }
        return result;
    }

    @Benchmark
    public List<Double> stream() {
        return sourceList.stream()
                .filter(i -> i % 2 == 0)
                .map(Math::sqrt)
                .collect(Collectors.toCollection(
                    () -> new ArrayList<>(sourceList.size() / 2 + 1)));
    }
}

結果:

Benchmark                   Mode   Samples         Mean   Mean error    Units
StreamVsVanilla.stream      avgt        10       17.588        0.230    ns/op
StreamVsVanilla.vanilla     avgt        10       10.796        0.063    ns/op

調査結果

とは対照的に初期結果では、JMH ベンチマークは、この特定のシナリオでは、従来のコレクション アプローチがストリーム アプローチよりも大幅に高速であることを明確に示しています。

結論

これらの改善されたベンチマークに基づくと、その結果、次のことが結論付けられます。

  • ストリームは本質的にコレクションより遅いわけではありません。ただし、単純なフィルタリングやマッピング操作など、特定のユースケースではオーバーヘッドが利点を上回る可能性があります。
  • ストリームは、コードの単純さと保守性の点で大きな利点をもたらします。これらにより、データ処理パイプラインが簡素化され、定型コードが削減されます。
  • パフォーマンスが重要なコード パスについては、常に徹底的なベンチマークを実施し、アプリケーション固有の要件を考慮することをお勧めします。

以上が単純な操作の場合、ストリームは常に従来のコレクションよりも遅いですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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