Die Stream-API wurde entwickelt, um das Schreiben von Berechnungen auf eine Weise zu vereinfachen, die von der Art und Weise, wie sie ausgeführt werden, abstrahiert ist, und um das Umschalten zwischen sequentiell und parallel zu vereinfachen.
Nur weil es einfach ist, heißt das nicht, dass es immer eine gute Idee ist, und in der Tat ist es eine schlechte Idee, einfach .parallel()
überall vorbeizuschauen, nur weil man es kann.
Beachten Sie zunächst, dass Parallelität keine anderen Vorteile bietet als die Möglichkeit einer schnelleren Ausführung, wenn mehr Kerne verfügbar sind. Eine parallele Ausführung erfordert immer mehr Arbeit als eine sequentielle, da neben der Lösung des Problems auch das Versenden und Koordinieren von Unteraufgaben durchgeführt werden muss. Die Hoffnung ist, dass Sie schneller zur Antwort gelangen, indem Sie die Arbeit auf mehrere Prozessoren aufteilen. Ob dies tatsächlich geschieht, hängt von vielen Faktoren ab, einschließlich der Größe Ihres Datensatzes, der Anzahl der Berechnungen, die Sie für jedes Element ausführen, der Art der Berechnung (insbesondere interagiert die Verarbeitung eines Elements mit der Verarbeitung anderer Elemente?). , die Anzahl der verfügbaren Prozessoren und die Anzahl der anderen Aufgaben, die um diese Prozessoren konkurrieren.
Beachten Sie außerdem, dass Parallelität häufig auch Nichtdeterminismus in der Berechnung aufdeckt, der häufig durch sequentielle Implementierungen verborgen wird. Manchmal spielt dies keine Rolle oder kann durch Einschränkung der beteiligten Vorgänge gemildert werden (dh Reduktionsoperatoren müssen zustandslos und assoziativ sein.)
In der Realität beschleunigt Parallelität manchmal Ihre Berechnung, manchmal nicht und manchmal sogar. Es ist am besten, zuerst mit sequentieller Ausführung zu entwickeln und dann wo Parallelität anzuwenden
(A) Sie wissen, dass eine Leistungssteigerung tatsächlich Vorteile bringt und
(B) dass es tatsächlich eine erhöhte Leistung liefert.
(A) ist ein geschäftliches Problem, kein technisches. Wenn Sie ein Leistungsexperte sind, können Sie normalerweise den Code betrachten und (B) bestimmen, aber der kluge Weg ist zu messen. (Und stören Sie sich nicht einmal, bis Sie von (A) überzeugt sind. Wenn der Code schnell genug ist, sollten Sie Ihre Gehirnzyklen besser an anderer Stelle anwenden.)
Das einfachste Leistungsmodell für Parallelität ist das "NQ" -Modell, wobei N die Anzahl der Elemente und Q die Berechnung pro Element ist. Im Allgemeinen muss der Produkt-NQ einen bestimmten Schwellenwert überschreiten, bevor Sie einen Leistungsvorteil erzielen. Bei einem Problem mit niedrigem Q wie "Addiere Zahlen von 1 bis N" wird im Allgemeinen eine Gewinnschwelle zwischen N = 1000 und N = 10000 angezeigt. Bei Problemen mit höherem Q sehen Sie Breakevens bei niedrigeren Schwellenwerten.
Aber die Realität ist ziemlich kompliziert. Identifizieren Sie also erst, wenn die sequentielle Verarbeitung Sie tatsächlich etwas kostet, und messen Sie dann, ob Parallelität hilfreich ist, bis Sie Erfahrung gesammelt haben.