2015-06-07 3 views
8

Ich implementiere eine Spliterator, die explizit die Parallelisierung einschränkt, indem trySplit() return null zurückgegeben wird. Würde die Implementierung von estimateSize() Leistungsverbesserungen für einen von diesem Spliterator erzeugten Stream bieten? Oder ist die geschätzte Größe nur für die Parallelisierung nützlich?estimateSize() auf sequentiellem Spliterator

EDIT: Um zu klären, ich bin über eine geschätzte Größe speziell zu fragen. Mit anderen Worten, mein Spliterator hat nicht die SIZED Eigenschaft.

+0

Zumindest die ToArray-Methode wird geschätzte Größen verwenden; Eine einigermaßen genaue Schätzung kann das Kopieren reduzieren. –

Antwort

5

an der Aufrufhierarchie zeigt auf die entsprechende spliterator charakteristischen suchen, der es zumindest relevant für stream.toArray() Leistung des

enter image description here

Zusätzlich gibt es ein Äquivalent-Flag in dem internen Strom-Implementierung, die verwendet werden, scheint zum Sortieren:

enter image description here

So Abgesehen von Parallelstromoperationen scheint die Größenschätzung für diese beiden Operationen verwendet zu werden.

Ich beanspruche keine Vollständigkeit für meine Suche, also nehmen Sie diese als Beispiele.


Ohne die geschlichteten Kennlinie I nur Anrufe zu estimateSize() finden können, die zu der parallelen Ausführung der Stream-Pipeline relevant sind.

Natürlich könnte sich dies in der Zukunft ändern oder eine andere Stream-Implementierung als das Standard-JDK könnte sich anders verhalten.

+0

Clarified meine Frage ein wenig. – shmosel

+1

in diesem Fall scheint es nur für die parallele Ausführung verwendet werden – the8472

+0

Nun, der wichtigste Sätze ist der letzte: "* Natürlich könnte dies in der Zukunft ändern oder eine andere Stream-Implementierung als die Standard-JDK könnte man anders handeln *", was verdient +1. Es sollte auch beachtet werden, dass andere Bibliotheken auch direkt auf den "Spliterator" zugreifen und einen Vorteil aus einem solchen Merkmal ziehen können. Deshalb ist es immer empfehlenswert, gegen den * Vertrag * zu programmieren, nicht die aktuelle Implementierung. – Holger

0

A spliterator Elemente durchqueren kann:

1.Individually (tryAdvance())

2.Sequentially in loser Schüttung (forEachRemaining())

Wie pro java docsestimateSize() kommt während des Spaltens praktisch.

Spliter können über die Methode estimateSize() eine Schätzung der Anzahl der verbleibenden Elemente bereitstellen. Im Idealfall entspricht dieser Wert dem Merkmal SIZED und entspricht genau der Anzahl der Elemente, die bei einer erfolgreichen Traversierung auftreten würden. jedoch auch wenn sie nicht genau bekannt ist, ein Schätzwert Wert nützlich Operationen an der Quelle sein kann noch, wie durchgeführt wird, um als helfen festzustellen, ob es bevorzugt ist, weiter zu spalten oder die verbleibenden Elemente sequentiell durchqueren.

Da Ihr spliterator nicht die SIZED Merkmal estimateSize bieten wird keine Leistung hat (weil keine Parallelität), Bedenken Sie jedoch, dass Java-docs von estimateSize nichts von Parallelität nicht erwähnt, alle heißt es ist :

Returns: die geschätzte Größe oder Long.MAX_VALUE wenn unendlich, unbekannt, oder zu teuer zu berechnen.

+1

Das einzige Beispiel im fettgedruckten Abschnitt besteht darin, zu bestimmen, ob es vorzuziehen ist, weiter zu trennen. Und Splitting wird nur bei parallelen Streams verwendet, was das OP explizit ablehnt, daher die Frage. –

Verwandte Themen