Ich habe eine Vorhersage, bevor ich es mache, aber ich denke, es ist wichtig, es in Form zu halten.
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.
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.
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?
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.