Java: dont le problème est plus rapide, en flux ou en boucle

J'ai une prédiction avant de le faire, mais je pense qu'il est important de la garder en forme.

Qu'en est-il de la vitesse de traitement du flux?

Le streaming en langage Java est une fonctionnalité qui, lorsqu'elle est utilisée correctement, a le potentiel de passer à un code plus lisible, c'est-à-dire de prédire le comportement. Ce serait bien de pouvoir décrire dans un flux peu susceptible de provoquer des branchements.

Cependant, quand vous y pensez au moment de l'exécution, est-ce vraiment bon d'être un flux? Une pratique courante consiste à diffuser ce que vous écrivez en boucle.

Essayons

Alors, mesurons le temps nécessaire au processus de ** génération de nombres aléatoires 1 million de fois et de les ajouter tous **. L'environnement d'exécution est Win10Pro (i5, 8 Go de RAM).

InfinitTest2_loop.java



public class InfinitTest2_loop {

	public static void main(String[] args) {
		Double result = 0.0;
		var start = System.currentTimeMillis();
		for (int i = 0; i < 100 * 10000; i++) {
			result += Math.random();
		}
		var end = System.currentTimeMillis();
		System.out.println(result);
		System.out.println("Temps requis(milliseconde): " + (end - start));
	}
}

Convertissons rapidement ce code en flux. Passons-le à reduction () et décrivons le processus d'ajout.

InfinitTest2.java


import java.util.stream.Stream;

public class InfinitTest2 {

	public static void main(String[] args) {
		var start = System.currentTimeMillis();
		Double result = Stream.generate(Math::random)
					.limit(100 * 10000)
					.reduce((p, q) -> p + q).get();
		var end = System.currentTimeMillis();
		System.out.println(result);
		System.out.println("Temps requis(milliseconde): " + (end - start));
	}
}

Alors j'ai essayé les deux. Millisecondes lorsque chacun est exécuté 3 fois

--Version boucle: 45,41,39 --Version Stream: 63,71,70

La version en boucle s'exécute dans environ 70% du temps de traitement de la version de flux. Ouais, la version en boucle est plus rapide car elle ne gère pas mal la classe.

"Optimisation" qui ne peut pas être stupide

Je ne pense pas que nous devrions nous arrêter ici, Java est Java, y compris l'environnement d'exécution. Par exemple, si vous mettez la VM Java en mode serveur, vous essaierez d'optimiser autant que possible avant de l'exécuter, tout en étant conscient de l'optimisation lors de l'exécution dans une VM normale (Client VM).

PS> java -server -cp . InfinitTest
499714.1320036936
Temps requis(milliseconde): 63

Cela ne change pas beaucoup, mais quand il est répété, il est réglé en moins de 65 millisecondes, il semble donc que vous essayez «d'optimiser dans la mesure du possible».

En matière d'optimisation, le problème de «l'optimisation lors de l'exécution» qui s'est posé rapidement est le mouvement «d'optimisation des pièces souvent exécutées en séquence». En d'autres termes, si elle boucle, cette partie n'est-elle pas accélérée par l'optimisation?

Bouclons une grande partie du processus précédent. J'écrirai ces deux parties en utilisant «for» pour qu'il n'y ait aucune différence.


public class InfinitTest2_loop {

	public static void main(String[] args) {
		for (int n = 0; n < 100; n++) {
			Double result = 0.0;
			var start = System.currentTimeMillis();
			for (int i = 0; i < 100 * 10000; i++) {
				result += Math.random();
			}
			var end = System.currentTimeMillis();
			System.out.println(result);
			System.out.println("Temps requis(milliseconde): " + (end - start));
		}
	}

}
import java.util.stream.Stream;

public class InfinitTest {

	public static void main(String[] args) {
		for (int i = 0; i < 100; i++) {
			var start = System.currentTimeMillis();
			Double result = Stream.generate(Math::random).limit(100 * 10000).reduce((p, q) -> p + q).get();
			var end = System.currentTimeMillis();
			System.out.println(result);
			System.out.println("Temps requis(milliseconde): " + (end - start));
		}
	}
}

J'ai essayé de le répéter 100 fois. La sortie en millisecondes a progressivement diminué, probablement parce que l'optimisation a commencé en cours.

Quand j'ai éteint chacune des trois dernières fois, c'est devenu comme ça.

--Version boucle: 33,34,22 --Version de flux: 32,30,39

Oh, la différence est assez proche (bien que la version en boucle soit toujours rapide).

Donc, si vous devez remplacer le traitement en boucle par un flux et que vous devez être conscient de la vitesse,

――Sachez que vous pouvez vous attendre à une optimisation par traitement itératif pour accélérer la partie flux.

Est-ce un endroit comme ça?

Flou

Je me demande s'il existe un générateur de flux qui génère des données un nombre infini de fois (jusqu'à ce qu'il sorte dans certaines conditions) sans rien passer. Il s'agit de savoir si while (true) {...} peut être exprimé dans un flux.

Recommended Posts

Java: dont le problème est plus rapide, en flux ou en boucle
Quel est le plus rapide, taille ou 0, comme argument de List # toArray?
La question de savoir quel est le meilleur, si ou changer
L'ordre des modificateurs de méthode Java est fixe
Qui est plus rapide, référence de méthode ou expression lambda
Quel est le plus rapide, Array # sample ou Random # rand?
Première touche de la classe Files (ou Java 8)
Briser de force le problème C "* 3 ou / 2" de [AtCoder Problem-ABC100] avec Java [Code]
Java: utilisez Stream pour trier le contenu d'une collection
Je veux savoir quelle version de java le fichier jar que j'ai est disponible
La méthode de la fonction primitive spécialisée IntFunction s'applique-t-elle ou applyAsInt?
[Java11] Résumé du flux -Avantages du flux-
5ème jour de Java
Explorons un peu plus l'API Stream, dont je comprends que c'est une réécriture.
La milliseconde définie dans /lib/calendars.properties de Java jre est UTC
Qu'est-ce que @Override ou @SuppressWarnings ("SleepWhileInLoop") devant la fonction? ?? ??
La version d'Elasticsearch que vous utilisez est-elle compatible avec Java 11?
Méthode d'enquête lorsque le processeur du serveur exécutant java est lourd
[Java] Supprimer les éléments de la liste
Quel est le meilleur client HTTP pour Java?
[java8] Pour comprendre l'API Stream
'% 02d' Quel est le% de% 2?
[Édition Java] Histoire de la sérialisation
À propos de Lambda, Stream, LocalDate de Java8
Où est le fuseau horaire de Java LocalDateTime.now ()?
Un mémorandum du problème FizzBuzz
Flux de traitement de base de Java Stream
L'origine des expressions Java lambda
[Servlet Java] La route de Senri est aussi la cinquième étape d'une étape
[Servlet Java] La route de Senri est également une étape vers la première
[Servlet Java] La route de Senri est aussi la troisième étape de la première étape
À partir de Java9, les constructeurs de classe correspondant aux types primitifs sont marqués comme obsolètes.
[Java] java.lang.NoClassDefFoundError: Résolution du problème de chute dans org / jsoup / safety / Whitelist
[Servlet Java] La route de Senri est aussi la quatrième étape de la première étape
[6 sélections de comparaison d'outils de formulaire] Quel est le meilleur, open source ou commercial?
[Java] Vérifiez si la chaîne de caractères est composée uniquement de blancs (= Vierge)
Obtenez le résultat de POST en Java
Vérifiez le contenu du magasin de certificats Java
Examiner l'utilisation de la mémoire des éléments Java
Qu'est-ce qu'un test? ・ À propos de l'importance d'un test
Essayez d'utiliser l'API Stream en Java
Mémo: [Java] Vérifiez le contenu du répertoire
[Traitement × Java] Comment utiliser la boucle
Quelle est la meilleure lecture de fichier (Java)
Comparer les éléments d'un tableau (Java)
Quelle est la méthode principale en Java?
Quelles sont les fonctionnalités mises à jour de Java 13
Quelle est la structure des données d'ActionText?
Mesurez facilement la taille des objets Java
L'API de sécurité Java EE est là!
Retour sur les bases de Java
Sortie du livre "Introduction à Java"
L'histoire de l'écriture de Java dans Emacs
[Java] Vérifiez le nombre d'occurrences de caractères
[Java] [Spring] Tester le comportement de l'enregistreur
[Java] Comment obtenir facilement la plus longue chaîne de caractères d'ArrayList à l'aide de stream
Upcast (Java) qui peut réduire la quantité de changement lorsque la spécification est modifiée
Incrémenté du troisième argument de la méthode iterate de la classe Stream ajoutée depuis Java9
[Java] Où est la classe d'implémentation de l'annotation qui existe dans BeanValidation?
[Java] Calculer le jour à partir de la date (ne pas utiliser la classe Calendar)