2015-06-07 8 views
8

Sto implementando un Spliterator che limita esplicitamente la parallelizzazione avendo trySplit() restituisce null. Implementare estimateSize() offre miglioramenti delle prestazioni per uno stream prodotto da questo spliterator? Oppure la dimensione stimata è utile solo per la parallelizzazione?estimateSize() su Spliterator sequenziale

EDIT: Per chiarire, sto chiedendo esplicitamente su una cifra stimata di dimensioni. In altre parole, il mio spliterator non ha la caratteristica SIZED.

+0

Almeno il metodo toArray utilizzerà le dimensioni stimate; una stima ragionevolmente accurata può ridurre la copia. –

risposta

5

Guardando la gerarchia di richiamo alla caratteristica spliterator rilevante rivela che si tratta di almeno rilevante per stream.toArray() prestazioni

enter image description here

Inoltre v'è una bandiera equivalente nell'attuazione flusso interno che sembra essere usato per l'ordinamento:

enter image description here

Così a parte le operazioni parallele, la stima delle dimensioni sembra essere utilizzata per queste due operazioni.

Non rivendico l'esaustività per la mia ricerca, quindi prendi questi come esempi.


Senza la caratteristica IMPRESE posso trovare solo le chiamate ai estimateSize() che sono rilevanti per l'esecuzione parallela del gasdotto torrente.

Ovviamente questo potrebbe cambiare in futuro o un'altra implementazione Stream rispetto a quella standard di JDK potrebbe agire diversamente.

+0

Chiarito la mia domanda un po '. – shmosel

+1

in questo caso sembra essere usato solo per l'esecuzione parallela – the8472

+0

Bene, le frasi più importanti sono le ultime: "* Ovviamente questo potrebbe cambiare in futuro o un'altra implementazione Stream rispetto a quella standard di JDK potrebbe agire diversamente *", che merita un +1. Va inoltre notato che anche altre librerie possono accedere direttamente a 'Spliterator' e trarre vantaggio da tale caratteristica. Ecco perché è sempre consigliabile programmare contro il * contratto *, non l'attuale implementazione. – Holger

0

Uno spliterator può attraversare elementi:

1.Individually (tryAdvance())

2.Sequentially sfusi (forEachRemaining())

Secondo java docsestimateSize() viene utile durante splitting.

Gli splitteratori possono fornire una stima del numero di elementi rimanenti tramite il metodo estimateSize(). Idealmente, come mostrato nella caratteristica , questo valore corrisponde esattamente al numero di elementi che si sarebbero verificati in una traversata di successo. Tuttavia, anche se non esattamente noto, un valore valore stimato potrebbe essere ancora utile per operazioni che vengono eseguite sul sorgente, come contribuendo a determinare se è preferibile dividere ulteriormente o attraversare i elementi rimanenti sequenzialmente.

Dal momento che lo spliterator non ha la caratteristica IMPRESE estimateSize non offrirà alcuna prestazione (a causa di nessun parallelismo), tuttavia tenere presente che Java-docs di estimateSize non menziona nulla di parallelismo, tutto ciò che afferma è :

Restituisce: la dimensione stimata, o se Long.MAX_VALUE infinita, sconosciuti, o troppo costose da calcolare.

+1

L'unico esempio fornito nella sezione in grassetto riguarda la determinazione se è preferibile suddividersi ulteriormente. E la divisione viene utilizzata solo su flussi paralleli, che l'OP rifiuta esplicitamente, quindi la domanda. –

Problemi correlati