Java: Das Problem ist schneller, Stream oder Loop

Ich habe eine Vorhersage, bevor ich es mache, aber ich denke, es ist wichtig, es in Form zu halten.

Was ist mit der Verarbeitungsgeschwindigkeit des Streams?

Streaming in der Java-Sprache ist eine Funktion, die bei ordnungsgemäßer Verwendung möglicherweise zu besser lesbarem Code übergeht, dh das Verhalten vorhersagt. Es wäre schön, in einem Fluss beschreiben zu können, der wahrscheinlich keine Verzweigung verursacht.

Wenn Sie jedoch zur Laufzeit darüber nachdenken, ist es wirklich gut, ein Stream zu sein? Es ist üblich, das, was Sie geschrieben haben, in einer Schleife zu streamen.

Lass es uns versuchen

Messen wir also die Zeit, die erforderlich ist, um ** 1 Million Mal Zufallszahlen zu generieren und alle ** hinzuzufügen. Die Ausführungsumgebung ist Win10Pro (i5, 8 GB 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("Benötigte Zeit(Millisekunde): " + (end - start));
	}
}

Lassen Sie uns diesen Code schnell in einen Stream konvertieren. Lassen Sie es uns an redu () übergeben und bis zum Additionsprozess beschreiben.

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("Benötigte Zeit(Millisekunde): " + (end - start));
	}
}

Also habe ich beides versucht. Millisekunden, wenn jede dreimal ausgeführt wird

Die Loop-Version läuft in etwa 70% der Verarbeitungszeit der Stream-Version. Ja, die Loop-Version ist schneller, weil sie die Klasse nicht schlecht handhabt.

"Optimierung" kann nicht dumm sein

Ich denke nicht, dass wir hier enden sollten, Java ist Java einschließlich der Ausführungsumgebung. Wenn Sie beispielsweise die Java-VM in den Servermodus versetzen, werden Sie versuchen, vor der Ausführung so viel wie möglich zu optimieren, während Sie die Optimierung während der Ausführung in einer normalen VM (Client-VM) kennen.

PS> java -server -cp . InfinitTest
499714.1320036936
Benötigte Zeit(Millisekunde): 63

Das ändert sich nicht viel, aber wenn es wiederholt wird, wird es innerhalb von 65 Millisekunden erledigt, so dass Sie anscheinend versuchen, "so weit wie möglich zu optimieren".

Wenn es um die Optimierung geht, ist das Problem der "Optimierung während der Ausführung", das schnell auftrat, die Bewegung, "die Teile zu optimieren, die oft nacheinander ausgeführt werden". Mit anderen Worten, wenn es Schleifen gibt, wird dieser Teil nicht durch Optimierung beschleunigt?

Lassen Sie uns einen Großteil des vorherigen Prozesses wiederholen. Ich werde diese beiden Teile mit "für" schreiben, damit es keinen Unterschied gibt.


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("Benötigte Zeit(Millisekunde): " + (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("Benötigte Zeit(Millisekunde): " + (end - start));
		}
	}
}

Ich habe versucht, es 100 Mal zu wiederholen. Die Millisekundenleistung nahm allmählich ab, wahrscheinlich weil die Optimierung unterwegs begann.

Als ich jedes der letzten drei Male löschte, wurde es so.

Oh, der Unterschied ist ziemlich groß (obwohl die Loop-Version immer noch schnell ist).

Wenn Sie also die Schleifenverarbeitung durch einen Stream ersetzen sollten und sich der Geschwindigkeit bewusst sein müssen,

Ist es so ein Ort?

Verschwommen

Ich frage mich, ob es einen Stream-Generator gibt, der unendlich oft Daten generiert (bis er unter bestimmten Bedingungen beendet wird), ohne etwas zu übergeben. Es ist eine Geschichte darüber, ob "while (true) {...}" in einem Stream ausgedrückt werden kann.

Recommended Posts

Java: Das Problem ist schneller, Stream oder Loop
Was ist schneller, Größe oder 0, als Argument von List # toArray?
Die Frage, welche besser ist, ob oder wechseln
Die Reihenfolge der Java-Methodenmodifikatoren ist festgelegt
Welches ist schneller, Methodenreferenz oder Lambda-Ausdruck
Was ist schneller, Array # Sample oder Random # Rand?
Erster Touch der Files-Klasse (oder Java 8)
Durchbrechen Sie gewaltsam das C-Problem "* 3 oder / 2" von [AtCoder Problem-ABC100] mit Java [Code]
Java: Verwenden Sie Stream, um den Inhalt einer Sammlung zu sortieren
Ich möchte herausfinden, welche Java-Version die JAR-Datei hat, die ich habe
Gilt die Methode der primitiven spezialisierten IntFunction oder applyAsInt?
[Java11] Stream-Zusammenfassung - Vorteile von Stream -
5. Tag von Java
Lassen Sie uns etwas tiefer in die Stream-API eintauchen, von der ich verstehe, dass sie neu geschrieben wurde.
Die in /lib/calendars.properties von Java jre festgelegte Millisekunde ist UTC
Was ist @Override oder @SuppressWarnings ("SleepWhileInLoop") vor der Funktion? ?? ??
Ist die von Ihnen verwendete Version von Elasticsearch mit Java 11 kompatibel?
Untersuchungsmethode, wenn die CPU des Servers, auf dem Java ausgeführt wird, schwer ist
[Java] Löschen Sie die Elemente von List
Welcher ist der beste HTTP-Client für Java?
[java8] Um die Stream-API zu verstehen
'% 02d' Was ist der% von% 2?
[Java Edition] Geschichte der Serialisierung
Über Lambda, Stream, LocalDate von Java8
Wo ist die Zeitzone von Javas LocalDateTime.now ()?
Ein Memorandum über das FizzBuzz-Problem
Grundlegender Verarbeitungsablauf von Java Stream
Der Ursprung von Java-Lambda-Ausdrücken
[Java Servlet] Die Straße von Senri ist auch der fünfte Schritt von einem Schritt
[Java Servlet] Die Straße von Senri ist auch ein Schritt zum ersten
[Java Servlet] Die Straße von Senri ist auch der dritte Schritt vom ersten Schritt
Ab Java9 werden Klassenkonstruktoren, die primitiven Typen entsprechen, als veraltet markiert.
[Java] java.lang.NoClassDefFoundError: Behebung des Problems, in org / jsoup / security / Whitelist zu fallen
[Java Servlet] Die Straße von Senri ist auch der vierte Schritt vom ersten Schritt
[6 Auswahlmöglichkeiten für den Vergleich von Formularwerkzeugen] Was ist besser, Open Source oder kommerziell?
[Java] Überprüfen Sie, ob die Zeichenfolge nur aus Leerzeichen besteht (= Leerzeichen)
Holen Sie sich das Ergebnis von POST in Java
Überprüfen Sie den Inhalt des Java-Zertifikatspeichers
Untersuchen Sie die Speichernutzung von Java-Elementen
Was ist ein Test? ・ Über die Wichtigkeit eines Tests
Versuchen Sie es mit der Stream-API in Java
Anmerkung: [Java] Überprüfen Sie den Inhalt des Verzeichnisses
[Verarbeitung × Java] Verwendung der Schleife
Was ist das beste Lesen von Dateien (Java)
Vergleichen Sie Elemente eines Arrays (Java)
Was ist die Hauptmethode in Java?
Was sind die aktualisierten Funktionen von Java 13
Wie ist die Datenstruktur von ActionText?
Messen Sie einfach die Größe von Java-Objekten
Die Java EE Security API ist da!
Rückblick auf die Grundlagen von Java
Ausgabe des Buches "Einführung in Java"
Die Geschichte des Schreibens von Java in Emacs
[Java] Überprüfen Sie die Anzahl der Zeichen
[Java] [Spring] Testen Sie das Verhalten des Loggers
[Java] So erhalten Sie mithilfe von Stream auf einfache Weise die längste Zeichenfolge von ArrayList
Upcast (Java), das den Änderungsbetrag reduzieren kann, wenn die Spezifikation geändert wird
Inkrementiert durch das dritte Argument der iterierten Methode der aus Java9 hinzugefügten Stream-Klasse
[Java] Wo befindet sich die Implementierungsklasse der Annotation, die in BeanValidation vorhanden ist?
[Java] Tag ab Datum berechnen (Kalenderklasse nicht verwenden)