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