Ich implementiere ein Spliterator
, das die Parallelisierung explizit einschränkt, indem ich trySplit()
return null
habe. Würde die Implementierung von estimateSize()
irgendwelche Leistungsverbesserungen für einen von diesem Spliterator erzeugten Stream bieten? Oder ist die geschätzte Größe nur für die Parallelisierung nützlich?
BEARBEITEN: Um klarzustellen, frage ich speziell nach einer geschätzten Größe. Mit anderen Worten, mein Spliterator hat nicht die Eigenschaft SIZED
.
Wenn Sie die Aufrufhierarchie für die relevante Spliterator-Eigenschaft betrachten, wird angezeigt, dass sie mindestens für stream.toArray()
performance
Zusätzlich gibt es in der internen Stream-Implementierung ein äquivalentes Flag, das anscheinend zum Sortieren verwendet wird:
Neben den Parallel-Stream-Operationen scheint also die Größenschätzung für diese beiden Operationen zu gelten.
Ich beanspruche keine Vollständigkeit für meine Suche, also nehmen Sie diese als Beispiele.
Ohne das SIZED-Merkmal kann ich nur Aufrufe von estimateSize()
finden, die für die parallele Ausführung der Stream-Pipeline relevant sind.
Natürlich könnte sich das in Zukunft ändern oder eine andere Stream-Implementierung als das Standard-JDK könnte sich anders verhalten.
Ein Spliterator kann Elemente durchqueren:
1.Individuell ( tryAdvance () )
2.Sequenzweise in großen Mengen ( forEachRemaining () )
Gemäß Java-Dokumentation estimateSize()
kommt praktisch beim Teilen.
Spliterators können eine Schätzung der verbleibenden Anzahl bereitstellen Elemente über die Methode estimateSize (). Im Idealfall, wie in Englisch: www.weisang.info/index.php?id=143&t...h=fbcd8dcdcf Kennwert SIZED entspricht genau dieser Zahl Elemente, die bei einer erfolgreichen Traversierung auftreten würden. Allerdings selbst wenn nicht genau bekannt, kann ein geschätzter Wert immer noch sein nützlich für Operationen, die an der Quelle ausgeführt werden, z Bestimmen Sie, ob es vorzuziehen ist, weiter zu splitten oder die verbleibende Elemente nacheinander .
Da Ihr Spliterator nicht die SIZED-Eigenschaft hat, bietet estimateSize
keine Performance (weil keine Parallelität vorhanden ist). Beachten Sie jedoch, dass Java-Dokumente von estimateSize
nichts von Parallelität nennen, sondern alles, was es sagt ist:
Gibt die geschätzte Größe oder Long.MAX_VALUE zurück, wenn unendlich, unbekannt, oder zu teuer, um sie zu berechnen.
Tags und Links java java-8 java-stream spliterator