Hi Tagir,

I would agree with you out about changing to use unordered() except that it is 
a List that is returned, whose Spliterator is specified to report ORDERED.

I don’t particular want to add a special spliterator for this case to avoid 
some profile pollution. Will it not just push the pollution further down the 
road to Spliterator.forEachRemaining? or to within other code?

Alas i think profile pollution is current fact of JDK life when inverting 
control with lambdas. What we really require is a better way to specialise the 
hot loops.

Paul.

On 28 Jul 2015, at 10:37, Tagir F. Valeev <amae...@gmail.com> wrote:

> Hello!
> 
> Current implementation of Collections.nCopies().stream() is as
> follows:
> 
> http://hg.openjdk.java.net/jdk9/dev/jdk/file/f160dec9a350/src/java.base/share/classes/java/util/Collections.java#l5066
> 
> public Stream<E> stream() {
>    return IntStream.range(0, n).mapToObj(i -> element);
> }
> 
> @Override
> public Stream<E> parallelStream() {
>    return IntStream.range(0, n).parallel().mapToObj(i -> element);
> }
> 
> The problem is that it adds a lambda expression to the
> RangeIntSpliterator type profile which can be polluted by some other
> code and vice versa: using nCopies().stream() may pollute the type
> profile for other code making it slower.
> 
> Another thing which is missing in current implementation is unordered
> mode. This collection is unordered by nature, its stream is similar to
> Stream.generate(), so to my opinion it should be unordered which may
> improve the parallel reduction in some cases.
> 
> This can be improved by introducing the custom spliterator class which
> is quite simple:
> https://gist.github.com/amaembo/62f3efee9923b1468e86
> 
> On pre-polluted type profile with simple mapping and reduction using
> custom spliterator is about 25-30% faster in both parallel and
> sequential cases as benchmarking shows (performed on 4-core cpu).
> 
> What do you think?
> 
> With best regards,
> Tagir Valeev.
> 

Reply via email to