RFR: 8333265: De-duplicate method references in java.util.stream.FindOps
ExE Boss
duke at openjdk.org
Thu Jun 6 08:48:46 UTC 2024
On Thu, 30 May 2024 12:50:36 GMT, Claes Redestad <redestad at openjdk.org> wrote:
> Extracting duplicate method references to static field reduce proxy class spinning and loading. In this case 2 less classes loaded when using `findAny()` on each type of stream.
The intermediate `Predicate`s and `Supplier`s don’t need to be fields, and it’s probably better for them to be locals:
src/java.base/share/classes/java/util/stream/FindOps.java line 204:
> 202:
> 203: static final FindOp<?, ?> OP_FIND_ANY = new FindOp<>(false,
> 204: StreamShape.REFERENCE, Optional.empty(), IS_PRESENT, NEW);
Suggestion:
static final TerminalOp<?, ?> OP_FIND_FIRST, OP_FIND_ANY;
static {
Predicate<Optional<Object>> isPresent = Optional::isPresent;
Supplier<TerminalSink<Object, Optional<Object>>> newSink
= FindSink.OfRef::new;
OP_FIND_FIRST = new FindOp<>(true, StreamShape.REFERENCE,
Optional.empty(), isPresent, newSink);
OP_FIND_ANY = new FindOp<>(false, StreamShape.REFERENCE,
Optional.empty(), isPresent, newSink);
}
src/java.base/share/classes/java/util/stream/FindOps.java line 227:
> 225: StreamShape.INT_VALUE, OptionalInt.empty(), IS_PRESENT, NEW);
> 226: static final TerminalOp<Integer, OptionalInt> OP_FIND_ANY = new FindOp<>(false,
> 227: StreamShape.INT_VALUE, OptionalInt.empty(), IS_PRESENT, NEW);
Suggestion:
static final TerminalOp<Integer, OptionalInt> OP_FIND_FIRST, OP_FIND_ANY;
static {
Predicate<OptionalInt> isPresent = OptionalInt::isPresent;
Supplier<TerminalSink<Integer, OptionalInt> newSink
= FindSink.OfInt::new;
OP_FIND_FIRST = new FindOp<>(true, StreamShape.INT_VALUE,
OptionalInt.empty(), isPresent, newSink);
OP_FIND_ANY = new FindOp<>(false, StreamShape.INT_VALUE,
OptionalInt.empty(), isPresent, newSink);
}
src/java.base/share/classes/java/util/stream/FindOps.java line 250:
> 248: StreamShape.LONG_VALUE, OptionalLong.empty(), IS_PRESENT, NEW);
> 249: static final TerminalOp<Long, OptionalLong> OP_FIND_ANY = new FindOp<>(false,
> 250: StreamShape.LONG_VALUE, OptionalLong.empty(), IS_PRESENT, NEW);
Suggestion:
static final TerminalOp<Long, OptionalLong> OP_FIND_FIRST, OP_FIND_ANY;
static {
Predicate<OptionalLong> isPresent = OptionalLong::isPresent;
Supplier<TerminalSink<Long, OptionalLong> newSink
= FindSink.OfLong::new;
OP_FIND_FIRST = new FindOp<>(true, StreamShape.LONG_VALUE,
OptionalLong.empty(), isPresent, newSink);
OP_FIND_ANY = new FindOp<>(false, StreamShape.LONG_VALUE,
OptionalLong.empty(), isPresent, newSink);
}
src/java.base/share/classes/java/util/stream/FindOps.java line 273:
> 271: StreamShape.DOUBLE_VALUE, OptionalDouble.empty(), IS_PRESENT, NEW);
> 272: static final TerminalOp<Double, OptionalDouble> OP_FIND_ANY = new FindOp<>(false,
> 273: StreamShape.DOUBLE_VALUE, OptionalDouble.empty(), IS_PRESENT, NEW);
Suggestion:
static final TerminalOp<Double, OptionalDouble> OP_FIND_FIRST, OP_FIND_ANY;
static {
Predicate<OptionalDouble> isPresent = OptionalDouble::isPresent;
Supplier<TerminalSink<Double, OptionalLong> newSink
= FindSink.OfDouble::new;
OP_FIND_FIRST = new FindOp<>(true, StreamShape.DOUBLE_VALUE,
OptionalDouble.empty(), isPresent, newSink);
OP_FIND_ANY = new FindOp<>(false, StreamShape.DOUBLE_VALUE,
OptionalDouble.empty(), isPresent, newSink);
}
-------------
PR Review: https://git.openjdk.org/jdk/pull/19477#pullrequestreview-2101252355
PR Review Comment: https://git.openjdk.org/jdk/pull/19477#discussion_r1629032905
PR Review Comment: https://git.openjdk.org/jdk/pull/19477#discussion_r1629035242
PR Review Comment: https://git.openjdk.org/jdk/pull/19477#discussion_r1629040800
PR Review Comment: https://git.openjdk.org/jdk/pull/19477#discussion_r1629043309
More information about the core-libs-dev
mailing list