Heim  >  Artikel  >  Java  >  Artikel Seien Sie vorsichtig, wenn Sie parallele Streams ausführen

Artikel Seien Sie vorsichtig, wenn Sie parallele Streams ausführen

王林
王林Original
2024-08-23 18:02:36400Durchsuche

Item  Tenha cuidado ao fazer streams paralelas

Java und Wettbewerb:

  • Java war schon immer Vorreiter bei der Erleichterung gleichzeitiger Programmierung, bietet seit 1996 native Thread-Unterstützung und hat sich weiterentwickelt, um Bibliotheken wie java.util.concurrent und das Fork-Join-Framework einzubeziehen.

Streams und Parallelität:

  • Mit der Einführung von Streams in Java 8 wurde es einfacher, Vorgänge mit einem einzigen Aufruf der parallel()-Methode zu parallelisieren. Doch trotz der Leichtigkeit bleibt das Schreiben korrekter und schneller gleichzeitiger Programme eine Herausforderung.

Leistung und Ausfälle:

  • Unvorsichtige Parallelisierung von Stream-Pipelines kann zu Leistungs- und Liveness-Fehlern führen (Programme, die nicht abgeschlossen werden). Ein Beispiel zeigt, dass die Parallelisierung eines Streams zu einer erheblichen Steigerung der CPU-Auslastung ohne sichtbare Ergebnisse führen kann.

Heuristiken und Einschränkungen:

  • Die Stream-Parallelisierung kann fehlschlagen, wenn die zur Aufteilung der Arbeit verwendeten Heuristiken nicht geeignet sind, insbesondere bei Operationen wie Stream.iterate und limit, bei denen die Kosten für die Berechnung zusätzlicher Elemente sehr hoch sein können.

Ideale Datenstrukturen:
Streams über ArrayList, HashMap, HashSet, ConcurrentHashMap, Arrays und Bereiche sind aufgrund der einfachen Aufteilung der Arbeit zwischen Threads und der guten Referenzlokalität bessere Kandidaten für die Parallelisierung.

Terminalbetrieb:

  • Die Wirksamkeit der parallelen Ausführung hängt auch vom Terminalbetrieb des Streams ab. Reduktionsoperationen wie „reduce“, „min“, „max“, „count“ und „sum“ sowie Kurzschlussoperationen wie „anyMatch“, „allMatch“ und „noneMatch“ eignen sich besser für die Parallelität.

Strenge Spezifikationen:

  • Funktionen, die in parallelen Pipelines verwendet werden, müssen assoziativ, nicht störend und zustandslos sein. Ein Verstoß gegen diese Regeln kann zu falschen Ergebnissen oder katastrophalen Ausfällen führen.

Ausführungsbefehle:

  • Das Parallelisieren einer Pipeline kann die Ausgabe überladen und Vorgänge wie forEachOrdered können erforderlich sein, um die Ordnung aufrechtzuerhalten.

Begründete Parallelität:

  • Parallelisieren Sie einen Stream nur, wenn es eine solide Begründung gibt. Unzureichende Parallelität kann zu Abstürzen oder schlechter Leistung führen. Messen Sie die Leistung immer vor und nach der Parallelisierung, um sicherzustellen, dass sie von Vorteil ist.

Beispiel für Wirksamkeit:

  • Ein einfaches Beispiel zeigte, dass die Parallelisierung einer π(n)-Berechnung die Ausführungszeit von 31 auf 9,2 Sekunden reduzierte, was zeigt, dass Parallelität in bestimmten Szenarien effizient sein kann.

Verwendung von SplittableRandom:

  • Für parallele Zufallszahlenströme bevorzugen Sie SplittableRandom gegenüber ThreadLocalRandom oder Random, da es speziell für diese Verwendung entwickelt wurde und eine bessere Leistung bietet.

Fazit:

  • Versuchen Sie nicht, eine Stream-Pipeline zu parallelisieren, ohne einen guten Grund zu der Annahme zu haben, dass dadurch die Berechnungsgenauigkeit erhalten und die Geschwindigkeit erhöht wird. Führen Sie strenge Tests durch, um sicherzustellen, dass die Parallelität gerechtfertigt ist, bevor Sie sie auf den Produktionscode anwenden.

BEISPIELE
1. Beispiel für sequentiellen vs. sequentiellen Stream Parallel

  • Dieses Beispiel zeigt den Leistungsunterschied zwischen einem sequentiellen und einem parallelen Stream. ParallelStreamExample.java

2. Beispiel für die ineffiziente Verwendung von parallel()

  • Dieses Beispiel zeigt, wie Parallelisierung zu unerwartetem Verhalten führen kann. IneffizientParallelStream.java

3. Beispiel für die effiziente Nutzung von parallel()

  • Dieses Beispiel zeigt eine Situation, in der Parallelisierung tatsächlich die Leistung verbessern kann. EffizientParallelStream,java

4. Beispiel für Sicherheitslücken bei parallelen Streams

  • Dieses Beispiel zeigt, wie ein schlecht implementierter Reduzierungsvorgang bei paralleler Verwendung fehlschlagen kann. ParallelStreamSafetyExample.java

5. Beispiel mit SplittableRandom für parallele Streams

  • Dieses Beispiel zeigt die Verwendung von SplittableRandom in einem parallelen Stream, um eine bessere Leistung zu erzielen. SplittableRandomExample.java

Diese Beispiele helfen, Situationen zu veranschaulichen, in denen Parallelisierung nützlich sein kann, und zeigen auch die potenziellen Risiken der wahllosen Verwendung von parallel() auf.

Das obige ist der detaillierte Inhalt vonArtikel Seien Sie vorsichtig, wenn Sie parallele Streams ausführen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn