「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > 単純な操作の場合、ストリームは常に従来のコレクションよりも遅いですか?

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

2024 年 11 月 8 日に公開
ブラウズ:702

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 sourceList = new ArrayList();
    static {
        for (int i = 0; i  vanilla() {
        List 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 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

Findings

最初の結果とは対照的に、JMH ベンチマークは、従来の収集アプローチが従来の収集アプローチよりも大幅に高速であることを明確に示しています。

結論

これらの改善されたベンチマーク結果に基づいて、次のように結論付けることができます。

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

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3