Heim > Java > javaLernprogramm > Sind Streams für einfache Vorgänge immer langsamer als herkömmliche Sammlungen?

Sind Streams für einfache Vorgänge immer langsamer als herkömmliche Sammlungen?

Mary-Kate Olsen
Freigeben: 2024-11-03 17:46:02
Original
952 Leute haben es durchsucht

Are Streams Always Slower Than Traditional Collections for Simple Operations?

Java 8 Stream-Leistung vs. Traditionelle Sammlungen

Sie haben sich kürzlich an Java 8 gewagt und einen informellen Benchmark durchgeführt, um die Leistung seiner Stream-API mit klassischen Sammlungen zu vergleichen. Ihr Test umfasst das Filtern einer Liste von ganzen Zahlen, das Extrahieren der Quadratwurzel gerader Zahlen und das Speichern der Ergebnisse in einer Double-Liste. Sie stellen jedoch die Gültigkeit Ihres Tests in Frage und möchten unbedingt die tatsächlichen Auswirkungen auf die Leistung klären.

Bewertung des Benchmark-Tests

Ihre ersten Ergebnisse, die Streams anzeigten langsamer zu sein als Sammlungen, gab Anlass zur Sorge. Um eine zuverlässigere Bewertung zu gewährleisten, ist es wichtig, potenzielle Fehler zu beheben und einen fairen Test durchzuführen. Hier einige Überlegungen:

  • Verwendung von LinkedList: LinkedList ist keine optimale Wahl für die Ergebnisliste, da es keinen effizienten Direktzugriff gibt. Erwägen Sie stattdessen die Verwendung von ArrayList.
  • Benchmark-Methodik: Manuelles Benchmarking kann anfällig für Ungenauigkeiten sein. Nutzen Sie ein Benchmarking-Framework wie JMH (Java Microbenchmarking Harness), um präzisere und zuverlässigere Messungen bereitzustellen.

Richtige Benchmarking-Ergebnisse

Befolgen wir diese Empfehlungen und schauen wir uns noch einmal die an Leistungsbewertung mit JMH und verbesserten Benchmarking-Strategien:

@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)));
    }
}
Nach dem Login kopieren

Ergebnisse:

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
Nach dem Login kopieren

Ergebnisse

Im Gegensatz zu Die ersten Ergebnisse zeigen, dass der JMH-Benchmark deutlich zeigt, dass der traditionelle Sammlungsansatz in diesem speziellen Szenario deutlich schneller ist als der Stream-Ansatz.

Schlussfolgerung

Basierend auf diesem verbesserten Benchmarking Aus den Ergebnissen können wir schließen, dass:

  • Streams nicht grundsätzlich langsamer sind als Sammlungen. Allerdings kann ihr Overhead in bestimmten Anwendungsfällen, wie z. B. bei einfachen Filter- und Zuordnungsvorgängen, die Vorteile überwiegen.
  • Streams bieten erhebliche Vorteile im Hinblick auf die Einfachheit des Codes und die Wartbarkeit. Sie vereinfachen Datenverarbeitungspipelines und reduzieren den Boilerplate-Code.
  • Für leistungskritische Codepfade ist es immer ratsam, ein gründliches Benchmarking durchzuführen und die spezifischen Anforderungen Ihrer Anwendung zu berücksichtigen.

Das obige ist der detaillierte Inhalt vonSind Streams für einfache Vorgänge immer langsamer als herkömmliche Sammlungen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage