estimateSize () für den sequentiellen Spliterator

8

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 .

    
shmosel 07.06.2015, 09:03
quelle

2 Antworten

5

Wenn Sie die Aufrufhierarchie für die relevante Spliterator-Eigenschaft betrachten, wird angezeigt, dass sie mindestens für stream.toArray() performance

relevant ist

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.

    
the8472 07.06.2015, 09:56
quelle
0

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.

    
sol4me 07.06.2015 09:27
quelle