hg: lambda/lambda/jdk: - make PipelineHelper an abstract class AbstractPipeline extends from

Brian Goetz brian.goetz at oracle.com
Wed Apr 3 13:31:07 PDT 2013


For those following at home, this patch is a major performance-driven 
refactor of how we represent stream pipelines (but does not affect the 
API.)

These changes were enabled by the cumulative effect of eliminating a lot 
of low-value requirements along the way (e.g., can't re-use a stream 
after evaluating a terminal op; can't chain an intermediate op to the 
same stream twice; sequential or parallel are now all-or-nothing, 
instead of mix-and-match, etc.)  None of these obviously made a huge 
difference when we chose to eliminate them, but in the aggregate, the 
more "well-behaved" requirements enabled a more performance 
implementation, and most of us don't miss what we gave up.

The net result is that the startup overhead of constructing stream 
pipelines is greatly reduced, mostly by fusing objects (e.g., fusing 
PipelineHelper into AbstractPipeline, and fusing the Op and Pipeline 
objects.)  This reduces the breakeven cost in 
sequential-pipeline-vs-iterator from ~10 to ~5 in some unscientific 
tests, as well as reducing the sequential-vs-parallel breakeven, since 
all the startup work goes into the serial fraction of Amdahl's law. 
(Sequential streams win over iterator eventually because Spliterator has 
a lower per-element access cost than Iterator.)

On 4/3/2013 4:00 PM, paul.sandoz at oracle.com wrote:
> Changeset: f7fb4e3d6a20
> Author:    psandoz
> Date:      2013-04-03 21:51 +0200
> URL:       http://hg.openjdk.java.net/lambda/lambda/jdk/rev/f7fb4e3d6a20
>
> - make PipelineHelper an abstract class AbstractPipeline extends from
> - ops now extend from abstract shape-specific pipeline classes
> Contributed-by: Brian Goetz <brian.goetz at Oracle.COM>, Paul Sandoz <paul.sandoz at Oracle.COM>
>
> ! src/share/classes/java/util/stream/AbstractPipeline.java
> ! src/share/classes/java/util/stream/AbstractShortCircuitTask.java
> ! src/share/classes/java/util/stream/AbstractTask.java
> - src/share/classes/java/util/stream/DistinctOp.java
> + src/share/classes/java/util/stream/DistinctOps.java
> ! src/share/classes/java/util/stream/DoublePipeline.java
> ! src/share/classes/java/util/stream/FindOps.java
> ! src/share/classes/java/util/stream/ForEachOps.java
> ! src/share/classes/java/util/stream/IntPipeline.java
> - src/share/classes/java/util/stream/IntermediateOp.java
> ! src/share/classes/java/util/stream/LongPipeline.java
> ! src/share/classes/java/util/stream/MatchOps.java
> ! src/share/classes/java/util/stream/NodeUtils.java
> ! src/share/classes/java/util/stream/PipelineHelper.java
> ! src/share/classes/java/util/stream/ReduceOps.java
> ! src/share/classes/java/util/stream/ReferencePipeline.java
> - src/share/classes/java/util/stream/SliceOp.java
> + src/share/classes/java/util/stream/SliceOps.java
> - src/share/classes/java/util/stream/SortedOp.java
> + src/share/classes/java/util/stream/SortedOps.java
> - src/share/classes/java/util/stream/StatefulOp.java
> ! src/share/classes/java/util/stream/StreamSpliterators.java
> ! src/share/classes/java/util/stream/Streams.java
> ! src/share/classes/java/util/stream/TerminalOp.java
> ! test-ng/bootlib/java/util/stream/CollectorOps.java
> ! test-ng/bootlib/java/util/stream/FlagDeclaringOp.java
> + test-ng/bootlib/java/util/stream/IntermediateOp.java
> ! test-ng/bootlib/java/util/stream/OpTestCase.java
> + test-ng/bootlib/java/util/stream/StatefulOp.java
> ! test-ng/bootlib/java/util/stream/TestFlagExpectedOp.java
> ! test-ng/boottests/java/util/stream/FlagOpTest.java
> ! test-ng/boottests/java/util/stream/UnorderedTest.java
> ! test-ng/tests/org/openjdk/tests/java/util/stream/RangeTest.java
> ! test-ng/tests/org/openjdk/tests/java/util/stream/TabulatorsTest.java
>
>


More information about the lambda-dev mailing list