Parallel Streams

Adriano10

Bekanntes Mitglied
Guten Tag,

ich möchte mich mit Parallel Streams auseinandersetzen. Parallel Streams ist im Vergleich zu Sequential zu langsam
Java:
public class Test {
    static List<File> materials = new ArrayList<>();
    static List<File> erp_mark = new ArrayList<>();
    static List<File> crossreference = new ArrayList<>();
    static List<File> dokuinfosatz = new ArrayList<>();
    public static void main(String[] args) throws InterruptedException {
      File file = new File("C:\\Users\\IdeaProjects\\XMLDateien\\xml");
      File[] files = file.listFiles();
      System.out.println("File length: " + files.length);

        System.out.println("START: ");
        final long timeStart = System.currentTimeMillis();
       // seq(files);
        parallel(files);
        final long timeEnd = System.currentTimeMillis();
        System.out.println("Verlaufszeit der Schleife: " + (timeEnd - timeStart) + " Millisek.");
        System.out.println("Materials: " + materials.size());
        System.out.println("Crossreference: " + crossreference.size());
        System.out.println("Erp_Mark: " + erp_mark.size());
        System.out.println("Dokuinfosatz: " + dokuinfosatz.size());
        System.out.println("Size: " + (materials.size() + crossreference.size() + erp_mark.size() + dokuinfosatz.size()));
    }

    private static void seq(File[] files) {
        //Heruntergeladene Dateienw werden in verschiedene Containers aufgeteilt
        for (File f : files) {
            if (f.getName().startsWith("Material")) {
                materials.add(f);
            } else if (f.getName().startsWith("ERP_MARKE")) {
                erp_mark.add(f);
            } else if (f.getName().startsWith("Crossreference")) {
                crossreference.add(f);
            } else {
                dokuinfosatz.add(f);
            }
        }
    }

    private static void parallel(File[] files) {
        materials = Arrays.asList(files).parallelStream().filter(f -> f.getName().startsWith("Material")).collect(Collectors.toList());
        erp_mark = Arrays.asList(files).parallelStream().filter(f -> f.getName().startsWith("ERP_MARKE")).collect(Collectors.toList());
        crossreference = Arrays.asList(files).parallelStream().filter(f -> f.getName().startsWith("Crossreference")).collect(Collectors.toList());
    }
}

Output von Parallel Stream:
File length: 258886
START:
Verlaufszeit der Schleife: 127 Millisek.
Materials: 216593
Crossreference: 7695
Erp_Mark: 34598
Dokuinfosatz: 0
Size: 258886

__________________

Output von Sequential:
File length: 258886
START:
Verlaufszeit der Schleife: 47 Millisek.
Materials: 216593
Crossreference: 7695
Erp_Mark: 34598
Dokuinfosatz: 0
Size: 258886

Ich dachte immer, dass Sequential Streams schneller ist als Sequential: Oder ich mache etwas falsch?

Vielen Dank im Voraus
 

LimDul

Top Contributor
Da ist nichts parallel. Ein Stream ist erst mal nichts anderes als eine for each Schleife.
Und da du dort 3 Streams hintereinander machst, ist das sogar langsamer als die for/each Schleife.

Siehe Doku:
Returns a sequential Stream with the specified array as its source.

Du musst den Stream dann auch parallelisieren. Da Arrays selber keine Methode dafür anbietet, müsstest du das über Arrays.stream().parallel() machen. Ob das wirklich schneller ist, ist immer eine Frage. Den Parallelität kostet immer Overhead. Am meisten bringt es, wenn die zu parallelisierenden Operationen teuer sind. Und das sind sie hier eher nicht. Sprich ich würde da auch nicht wirklich erwarten, dass es deutlich schneller ist. Aufgrund der drei Streams dürfte es evtl. immer noch langsamer sein.

Wenn du es parallelisierst, wird es vermutlich sogar auf die Bretter gehen oder inkorrekt sein. Denn eine ArrayList ist nicht Thread Safe - das heißt du musst da auch eine Thread Safe List verwenden.
 

LimDul

Top Contributor
Nochmal als Extra Anmerkung:

Parallelisierung macht Dinge nicht automatisch schneller, sondern erstmal nur deutlich komplexer und schwerer zu handhaben

Ob es schneller wird, hängt von einer Vielzahl von Faktoren ab, die man überblicken muss.
 

Adriano10

Bekanntes Mitglied
Da ist nichts parallel. Ein Stream ist erst mal nichts anderes als eine for each Schleife.
Und da du dort 3 Streams hintereinander machst, ist das sogar langsamer als die for/each Schleife.

Siehe Doku:


Du musst den Stream dann auch parallelisieren. Da Arrays selber keine Methode dafür anbietet, müsstest du das über Arrays.stream().parallel() machen. Ob das wirklich schneller ist, ist immer eine Frage. Den Parallelität kostet immer Overhead. Am meisten bringt es, wenn die zu parallelisierenden Operationen teuer sind. Und das sind sie hier eher nicht. Sprich ich würde da auch nicht wirklich erwarten, dass es deutlich schneller ist. Aufgrund der drei Streams dürfte es evtl. immer noch langsamer sein.

Wenn du es parallelisierst, wird es vermutlich sogar auf die Bretter gehen oder inkorrekt sein. Denn eine ArrayList ist nicht Thread Safe - das heißt du musst da auch eine Thread Safe List verwenden.
vielen Dank für die ausführlichen Infos.
 

KonradN

Super-Moderator
Mitarbeiter
@Adriano10 Geh auf sowas nicht erst ein und denk auch nicht drüber nach. Das Thema der Fragestellung ist ein komplexes Thema und da ist es normal, dass Fragen aufkommen oder Details unbekannt sind. Da aber von Dummheit zu sprechen ist einfach nicht zu rechtfertigen.

Also lass Dich von einem User hier nicht beeinflussen. Beschäftige Dich mit der Materie, wenn es Dich weiter interessiert und bei Fragen stellst Du diese. Diese sind willkommen und wie du merkst, sind du bekommst ja auch vernünftige Antworten. Auf diese solltest Du Dich konzentrieren und off topic Antworten ignorieren.
 

Adriano10

Bekanntes Mitglied
@Adriano10 Geh auf sowas nicht erst ein und denk auch nicht drüber nach. Das Thema der Fragestellung ist ein komplexes Thema und da ist es normal, dass Fragen aufkommen oder Details unbekannt sind. Da aber von Dummheit zu sprechen ist einfach nicht zu rechtfertigen.

Also lass Dich von einem User hier nicht beeinflussen. Beschäftige Dich mit der Materie, wenn es Dich weiter interessiert und bei Fragen stellst Du diese. Diese sind willkommen und wie du merkst, sind du bekommst ja auch vernünftige Antworten. Auf diese solltest Du Dich konzentrieren und off topic Antworten ignorieren.
vielen besten Dank, hier bekomme ich immer wirklich sehr hilfreiche Antworten, welche mir vermittelt, mein kleines Wissen zu erweitern
 

KonradN

Super-Moderator
Mitarbeiter
Da ist nichts parallel.
Das ist so aber nicht ganz richtig.

Arrays.asList(...).parallelStream() hat der TE ja genutzt und das erzeugt doch einen parallelen Stream. Damit ist die Abarbeitung der drei Zeilen durchaus bereits parallel und auch etwas vergleichbar mit deinem Arrays.stream(...).parallel().

Der Aufruf asList kopiert keine Daten sondern erzeugt nur eine Art Wrapper um das Array, so dass es von der Performance kaum einen Unterschied zu Arrays.stream(..) geben dürfte.

Oder habe ich da jetzt etwas übersehen?
 

LimDul

Top Contributor
Das ist so aber nicht ganz richtig.

Arrays.asList(...).parallelStream() hat der TE ja genutzt und das erzeugt doch einen parallelen Stream. Damit ist die Abarbeitung der drei Zeilen durchaus bereits parallel und auch etwas vergleichbar mit deinem Arrays.stream(...).parallel().
Entweder bin ich blind gewesen oder das wurde nachträglich bearbeitet. Ich bin relativ sicher nur Arrays.stream() gesehen zu haben.
 

KonradN

Super-Moderator
Mitarbeiter
Sowas ist normal ... im Forum liest man ja relativ schnell und da übersieht man oft etwas. Die generellen Hinweise sind aber wichtig und richtig ...

Du läufst halt einmal sequenziell durch und macht 3 Tests. Dann läufst Du dreimal durch - das zwar parallel, aber das kann nicht so viel rausholen wie das drei Mal über die Menge iterieren.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Mehrere Werte in einem Switch Case parallel überprüfen Java Basics - Anfänger-Themen 23
1 Threads parallel laufen Java Basics - Anfänger-Themen 11
M Mehre Dateien parallel kopieren mit Multithreading Java Basics - Anfänger-Themen 8
DaCrazyJavaExpert Threads Klicks pro Sekunde parallel zum Programm bekommen Java Basics - Anfänger-Themen 5
T Parallel ausführen Java Basics - Anfänger-Themen 1
I Threads Matrixmultiplikation parallel Java Basics - Anfänger-Themen 6
D main-Methode und Tread parallel ausführen Java Basics - Anfänger-Themen 0
B Threads parallel zur main Java Basics - Anfänger-Themen 3
J Können mehere Threads parallel eine Datei lesen? Java Basics - Anfänger-Themen 4
B JDK installieren Mehrere JDKs parallel Java Basics - Anfänger-Themen 3
P Threads Wann läuft es parallel ab ? Java Basics - Anfänger-Themen 4
krgewb Java Streams Java Basics - Anfänger-Themen 10
W Streams in Java und was bedeutet meine Konsolen-Ausgabe? Java Basics - Anfänger-Themen 4
M Streams Java Basics - Anfänger-Themen 34
M Streams filter Java Basics - Anfänger-Themen 15
M generate Methode für Streams Java Basics - Anfänger-Themen 6
berserkerdq2 Java streams, wann nutze ich ::, also 2x Doppelpuntk bei Streams? Java Basics - Anfänger-Themen 5
B Produkt eines double - streams Java Basics - Anfänger-Themen 3
berserkerdq2 IO Streams logfile erstellen und Sachen schreiben wie? Java Basics - Anfänger-Themen 2
D Verwirrung bei Streams aus primitiven Arrays Java Basics - Anfänger-Themen 2
B Collections Streams - Hilfestellung bei komplexer Struktur Java Basics - Anfänger-Themen 9
S Streams - Abfrage absteigend sortieren Java Basics - Anfänger-Themen 11
S Streams - kleinstes Element finden Java Basics - Anfänger-Themen 4
J String Array zu Map<Character, List<Character>> mit Streams Java Basics - Anfänger-Themen 1
Kirby.exe Fehlende Int Werte aus Array mit streams finden Java Basics - Anfänger-Themen 19
W Eclipse Autoformatierung für Streams ändern ? Java Basics - Anfänger-Themen 1
S Lambda Ausdrücke Streams Java Basics - Anfänger-Themen 6
I Streams Java Basics - Anfänger-Themen 12
N Frage zu Streams Java Basics - Anfänger-Themen 3
U Input/Output Unterschiede Streams Java Basics - Anfänger-Themen 2
X Streams und Ausgabe - lässt sich das einfacher schreiben oder schöner schreiben? Java Basics - Anfänger-Themen 5
C system.out.printf mit streams benutzen Java Basics - Anfänger-Themen 7
C Methoden Sortieren mit Streams: Auf- und absteigend Java Basics - Anfänger-Themen 2
O Streams und die flush Methode Java Basics - Anfänger-Themen 3
P InputStream eines Musik-Streams abspielen Java Basics - Anfänger-Themen 2
M Input/Output Streams Java Basics - Anfänger-Themen 5
T Klassen wie funktionieren Streams, warum bekomme ich int zurück? Java Basics - Anfänger-Themen 2
J Java 8 Streams - Frage zu "reduce" Java Basics - Anfänger-Themen 6
Sogomn Input/Output Reader, Writer und Streams Java Basics - Anfänger-Themen 6
T Fehler mit Streams! Java Basics - Anfänger-Themen 2
T Input/Output Object Streams Java Basics - Anfänger-Themen 6
J Per I/O Streams in LinkedList oder ArrayList schreiben/lesen Java Basics - Anfänger-Themen 6
I Java Streams Java Basics - Anfänger-Themen 6
R Streams for runaways Java Basics - Anfänger-Themen 5
RySa Input/Output Datei kann nicht gelöscht werden, obwohl Streams geschlossen sind. Java Basics - Anfänger-Themen 2
D Input/Output streams und readLine() Java Basics - Anfänger-Themen 3
firefexx Input/Output close() bei mehreren Streams Java Basics - Anfänger-Themen 5
M Frage zu Streams Java Basics - Anfänger-Themen 9
C try finally - Streams schließen Java Basics - Anfänger-Themen 7
M Streams und Sockets Java Basics - Anfänger-Themen 3
M file löschen, streams evtl noch offen Java Basics - Anfänger-Themen 7
G Character-orientierte File-Streams mit der Klasse FileReader Java Basics - Anfänger-Themen 5
S Piped Streams / Threads Java Basics - Anfänger-Themen 6
H Frage zu Byte-Streams Java Basics - Anfänger-Themen 2
P Streams mit Sockets Java Basics - Anfänger-Themen 7
V Performance Lesen und Schreiben aus/in Streams Java Basics - Anfänger-Themen 4
C RandomAccessFile vs. Streams Java Basics - Anfänger-Themen 5
M Probleme mit den Streams Java Basics - Anfänger-Themen 2
G streams schließen Java Basics - Anfänger-Themen 2
P Fragen zu STreams Java Basics - Anfänger-Themen 5
M Streams Java Basics - Anfänger-Themen 4
H Streams etc. erster Versuch Zeilen aus einer Datei zu lesen Java Basics - Anfänger-Themen 6
? Streams Java Basics - Anfänger-Themen 2
R RandomAccessFile mit anderen Streams verbinden Java Basics - Anfänger-Themen 5
G Rekursionsaufgabe mit Streams Java Basics - Anfänger-Themen 5
J Problem mit Streams Java Basics - Anfänger-Themen 15
L Streams und Reader/Writer Java Basics - Anfänger-Themen 8
K Frage zu SdtOut streams bzw. Socket Programmierung Java Basics - Anfänger-Themen 3
M Streams, read and write Java Basics - Anfänger-Themen 2
M Streams Java Basics - Anfänger-Themen 2
B Streams wollen scheinbar nicht schließen Java Basics - Anfänger-Themen 6
S Umwandlung eines Character-Streams in ein Image Java Basics - Anfänger-Themen 17
E Probleme mit Streams Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben