Parallel Stream-API
Du er sandsynligvis allerede bekendt med Stream API, dets metoder og hvordan det fungerer (Hvis ikke, gennemgå dette emne og vend derefter tilbage til dette kapitel).
En almindelig datastream er ikke parallel, det vil sige, uanset hvor bekvem og elegant den måtte være i koden, kan brug af Stream API uden at anvende parallelStream()-metoden, ved store datamængder, have en betydelig negativ indvirkning på ydeevnen.
Der findes også en parallel() metode, som kan anvendes efter konvertering til stream.
List<Integer> result = list.stream().parallel()
.map(num -> ++num)
.toList();
Forskellen er, at parallelStream() opretter en parallel stream direkte fra samlingen, mens parallel() konverterer en eksisterende seriel stream til en parallel stream.
Og vigtigst af alt, som programmører behøver vi ikke gøre andet end at ændre stream()-metoden til parallelStream(). Stream API håndterer alt selv og optimerer vores program!
Eksempel: Behandling af en liste med tal
Antag, at vi har en liste med tal, og vi ønsker at finde summen af kvadraterne af alle tallene i listen.
Main.java
123456789101112131415161718192021222324252627package com.example; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { // Create a list of integers List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // Sequential stream to sum the squares of numbers int sumSequential = numbers.stream() // Create a sequential stream from the list .mapToInt(n -> n * n) // Map each number to its square .sum(); // Sum the squares // Print the result of the sequential sum System.out.println("Sum of squares (sequential): " + sumSequential); // Parallel stream to sum the squares of numbers int sumParallel = numbers.parallelStream() // Create a parallel stream from the list .mapToInt(n -> n * n) // Map each number to its square .sum(); // Sum the squares // Print the result of the parallel sum System.out.println("Sum of squares (parallel): " + sumParallel); } }
Som du kan se, har vi blot erstattet stream() med parallelStream() OG DET ER DET HELE. I dette eksempel vil det ikke give nogen fordel, fordi et array med 10 tegn vil blive udført hurtigere i et enkelttrådet miljø. Dette skyldes, at implementeringen af Stream API udfører mange handlinger for at fordele opgaven mellem tråde.
Stream API bestemmer også selv, hvor mange tråde den vil bruge til denne opgave, så det bliver så effektivt som muligt.
Sådan fungerer det under motorhjelmen:
1. Oprettelse af en parallel stream: Når du kalder parallelStream(), opretter Java en parallel stream baseret på den oprindelige datakilde;
2. Brug af ForkJoinPool (vi ser nærmere på dette senere): Parallelle streams anvender en fælles tråd-pool, ForkJoinPool.commonPool(), som administrerer en gruppe af arbejdstråde;
3. Opdeling: Data i en parallel tråd opdeles i dele ved hjælp af Spliterator-interfacet;
4. Behandling: Hver arbejdståd i ForkJoinPool behandler sin del af dataene;
5. Sammenfletning: Efter behandlingen af dataene sammenfletter arbejdstådene resultaterne.
Fordele ved parallelle streams
Øget ydeevne er en af de vigtigste fordele ved parallelle tråde, da de muliggør opgavefordeling på tværs af flere tråde, hvilket resulterer i hurtigere behandling på multi-core processorer.
Derudover gør den brugervenlige parallelle tråde API det nemt at integrere i eksisterende kode, hvilket eliminerer behovet for kompleks trådhåndtering.
Endvidere er skalerbarhed en væsentlig fordel, da parallelle tråde automatisk tilpasser sig antallet af tilgængelige processorkerner og optimerer opgaveudførelsen effektivt.
1. Hvilken klasse bruges af parallelle tråde til at kontrollere tråde?
2. Hvilken metode bruges til at oprette en parallel stream?
3. Hvad gør Spliterator-interfacet i forbindelse med parallelle streams?
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat
Can you explain when it's best to use parallel streams versus regular streams?
What are some potential drawbacks or risks of using parallel streams?
Can you provide more examples of using parallel streams in Java?
Awesome!
Completion rate improved to 3.33
Parallel Stream-API
Stryg for at vise menuen
Du er sandsynligvis allerede bekendt med Stream API, dets metoder og hvordan det fungerer (Hvis ikke, gennemgå dette emne og vend derefter tilbage til dette kapitel).
En almindelig datastream er ikke parallel, det vil sige, uanset hvor bekvem og elegant den måtte være i koden, kan brug af Stream API uden at anvende parallelStream()-metoden, ved store datamængder, have en betydelig negativ indvirkning på ydeevnen.
Der findes også en parallel() metode, som kan anvendes efter konvertering til stream.
List<Integer> result = list.stream().parallel()
.map(num -> ++num)
.toList();
Forskellen er, at parallelStream() opretter en parallel stream direkte fra samlingen, mens parallel() konverterer en eksisterende seriel stream til en parallel stream.
Og vigtigst af alt, som programmører behøver vi ikke gøre andet end at ændre stream()-metoden til parallelStream(). Stream API håndterer alt selv og optimerer vores program!
Eksempel: Behandling af en liste med tal
Antag, at vi har en liste med tal, og vi ønsker at finde summen af kvadraterne af alle tallene i listen.
Main.java
123456789101112131415161718192021222324252627package com.example; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { // Create a list of integers List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // Sequential stream to sum the squares of numbers int sumSequential = numbers.stream() // Create a sequential stream from the list .mapToInt(n -> n * n) // Map each number to its square .sum(); // Sum the squares // Print the result of the sequential sum System.out.println("Sum of squares (sequential): " + sumSequential); // Parallel stream to sum the squares of numbers int sumParallel = numbers.parallelStream() // Create a parallel stream from the list .mapToInt(n -> n * n) // Map each number to its square .sum(); // Sum the squares // Print the result of the parallel sum System.out.println("Sum of squares (parallel): " + sumParallel); } }
Som du kan se, har vi blot erstattet stream() med parallelStream() OG DET ER DET HELE. I dette eksempel vil det ikke give nogen fordel, fordi et array med 10 tegn vil blive udført hurtigere i et enkelttrådet miljø. Dette skyldes, at implementeringen af Stream API udfører mange handlinger for at fordele opgaven mellem tråde.
Stream API bestemmer også selv, hvor mange tråde den vil bruge til denne opgave, så det bliver så effektivt som muligt.
Sådan fungerer det under motorhjelmen:
1. Oprettelse af en parallel stream: Når du kalder parallelStream(), opretter Java en parallel stream baseret på den oprindelige datakilde;
2. Brug af ForkJoinPool (vi ser nærmere på dette senere): Parallelle streams anvender en fælles tråd-pool, ForkJoinPool.commonPool(), som administrerer en gruppe af arbejdstråde;
3. Opdeling: Data i en parallel tråd opdeles i dele ved hjælp af Spliterator-interfacet;
4. Behandling: Hver arbejdståd i ForkJoinPool behandler sin del af dataene;
5. Sammenfletning: Efter behandlingen af dataene sammenfletter arbejdstådene resultaterne.
Fordele ved parallelle streams
Øget ydeevne er en af de vigtigste fordele ved parallelle tråde, da de muliggør opgavefordeling på tværs af flere tråde, hvilket resulterer i hurtigere behandling på multi-core processorer.
Derudover gør den brugervenlige parallelle tråde API det nemt at integrere i eksisterende kode, hvilket eliminerer behovet for kompleks trådhåndtering.
Endvidere er skalerbarhed en væsentlig fordel, da parallelle tråde automatisk tilpasser sig antallet af tilgængelige processorkerner og optimerer opgaveudførelsen effektivt.
1. Hvilken klasse bruges af parallelle tråde til at kontrollere tråde?
2. Hvilken metode bruges til at oprette en parallel stream?
3. Hvad gør Spliterator-interfacet i forbindelse med parallelle streams?
Tak for dine kommentarer!