„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > 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?

Veröffentlicht am 08.11.2024
Durchsuche:473

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 wahren 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 noch einmal Leistungsbewertung mit JMH und verbessertes Benchmarking Strategien:

@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)));
    }
}

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

Ergebnisse

Im Gegensatz zu den ersten Ergebnissen zeigt der JMH-Benchmark deutlich, dass der traditionelle Erfassungsansatz deutlich schneller ist als der Stream-Ansatz in diesem speziellen Fall Szenario.

Schlussfolgerung

Basierend auf diesen verbesserten Benchmarking-Ergebnissen können wir schließen, dass:

  • Streams sind nicht grundsätzlich langsamer 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.
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3