Java 8 ストリームのパフォーマンスと従来のコレクション
あなたは最近 Java 8 に挑戦し、そのストリーム API のパフォーマンスを従来のコレクションと比較する非公式のベンチマークを実施しました。テストには、整数のリストをフィルター処理し、偶数の平方根を抽出し、結果を Double リストに保存することが含まれます。しかし、あなたはテストの妥当性を疑問視しており、実際のパフォーマンスへの影響を明らかにしたいと考えています。
ベンチマーク テストの評価
ストリームを示した最初の結果コレクションよりも遅いという懸念が生じました。より信頼性の高い評価を保証するには、潜在的なエラーに対処し、公正なテストを実施することが不可欠です。
適切なベンチマーク結果
これらの推奨事項に従って、 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 サイトの他の関連記事を参照してください。