[Java] Rendez le programme 10 fois plus rapide avec parallelStream

Conclusion

parallelStream () peut rendre les programmes Java 10x plus rapides

environnement

Contenu de la vérification

Code de vérification

Main.java


import java.util.List;
import java.util.ArrayList;

public class Main {
	public static void main(String[] args) {
		List<Integer> n1 = new ArrayList<>();
		List<Integer> n2 = new ArrayList<>();

		for(int i = 0; i < 500; i++) {
			n1.add(i);
			n2.add(i);
		}

		long s1 = System.currentTimeMillis();
		n1.stream().forEach(i -> { try { Thread.sleep(10); } catch(Exception e) { e.printStackTrace(); } });
		long t1 = System.currentTimeMillis();

		long s2 = System.currentTimeMillis();
		n2.parallelStream().forEach(i -> { try { Thread.sleep(10); } catch(Exception e) { e.printStackTrace(); } });
		long t2 = System.currentTimeMillis();

		System.out.printf("n1 exec time: %d [ms]\n", t1 - s1);
		System.out.printf("n2 exec time: %d [ms]\n", t2 - s2);
	}
}

Il n'y a pas beaucoup de points à collecter et à expliquer. «n1» est un flux séquentiel et «n2» est un flux parallèle appelant «Thread.sleep (10)» 500 fois. Le try-catch est fait pour gérer l'exception vérifiée de Thread.sleep (). ʻI in forEach` disparaît dans le vide.

Résultat d'exécution

n1 exec time: 5298 [ms]
n2 exec time: 505 [ms]

«n2» est plus de 10 fois plus rapide que «n1»! Pour «n1», le résultat de 10 ms x 500 fois est clairement indiqué.

Supplément

Selon la documentation officielle (https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/ForkJoinPool.html), le nombre par défaut de threads parallèles est , Il semble être égal au nombre de processeurs disponibles dans l'ordinateur.

For applications that require separate or custom pools, a ForkJoinPool may be constructed with a given target parallelism level; by default, equal to the number of available processors.

En regardant le fait que le temps d'exécution dans le flux parallèle est inférieur à 1/10 de celui du flux séquentiel, il semble que le nombre de processeurs logiques soit appliqué comme valeur par défaut au lieu du nombre de processeurs physiques. "Ce sera 10 fois plus rapide" ... Oma Tamaki N'est-ce pas! !! Je pense qu'il y a un tsukkomi très raisonnable, mais je pense que les PC les plus récents ont environ 8 processeurs logiques, alors pardonnez-moi.

Mise en garde

Fondamentalement, vous ne devez pas mettre à jour ou supprimer les objets qui sont généralement référencés dans chaque thread (comme ajouter à la liste).

Recommended Posts

[Java] Rendez le programme 10 fois plus rapide avec parallelStream
Créez quelque chose comme Enum de Java avec Typescript
Rendre l'environnement SpringBoot1.5 + Gradle4.4 + Java8 + Docker compatible avec Java11
Rendre la ligne Java Stream agréable avec Eclipse
[Java] Hello World avec Java 14 x Spring Boot 2.3 x JUnit 5 ~
Accélérez le volume en utilisant Docker avec vscode.
Facile à créer LINE BOT avec Java Servlet
Prise en main des programmes Java à l'aide de Visual Studio Code
Rendre les gadgets de calendrier créés avec JavaFX compatibles avec Java SE 9
Surveillez l'état interne des programmes Java avec Kubernetes
J'avais l'habitude de faire nc (netcat) avec JAVA normalement
Faites un blackjack avec Java
Changer de siège avec Java
Installez Java avec Ansible
Téléchargement confortable avec JAVA
Téléchargement Java avec Ansible
Ruby 3.0 rend x ** 2 plus rapide
Raclons avec Java! !!
Construire Java avec Wercker
Conversion Endian avec JAVA
Le programme sera-t-il plus rapide simplement en augmentant la version Java?
[Débutant] Essayez de créer un jeu RPG simple avec Java ①
Je veux faire une liste avec kotlin et java!
Je veux créer une fonction avec kotlin et java!