RFR: 8196106: Support nested infinite or recursive flat mapped streams [v3]

Viktor Klang vklang at openjdk.org
Wed Apr 10 19:18:37 UTC 2024


> This PR implements Gatherer-inspired encoding of `flatMap` that shows that it is both competitive performance-wise as well as improve correctness.
> 
> Below is the performance of `Stream::flatMap` (for reference types):
> 
> Before this PR:
> 
> Benchmark            (size)   Mode  Cnt        Score       Error  Units
> FlatMap.par_array        10  thrpt   12   294008,937 ? 54369,110  ops/s
> FlatMap.par_array       100  thrpt   12    62411,229 ? 14868,119  ops/s
> FlatMap.par_array      1000  thrpt   12     8263,821 ?   452,622  ops/s
> FlatMap.par_iterate      10  thrpt   12    23029,978 ?  4274,449  ops/s
> FlatMap.par_iterate     100  thrpt   12    10532,907 ?   321,694  ops/s
> FlatMap.par_iterate    1000  thrpt   12      981,571 ?   135,270  ops/s
> FlatMap.seq_array        10  thrpt   12  2955648,495 ? 32539,142  ops/s
> FlatMap.seq_array       100  thrpt   12    41851,009 ?   377,546  ops/s
> FlatMap.seq_array      1000  thrpt   12     1740,281 ?  1229,974  ops/s
> FlatMap.seq_iterate      10  thrpt   12   321727,690 ?  5149,356  ops/s
> FlatMap.seq_iterate     100  thrpt   12     8437,198 ?    56,635  ops/s
> FlatMap.seq_iterate    1000  thrpt   12       76,994 ?     0,965  ops/s
> 
> 
> After this PR:
> 
> 
> Benchmark            (size)   Mode  Cnt        Score        Error  Units
> FlatMap.par_array        10  thrpt   12   283350,051 ?  35567,223  ops/s
> FlatMap.par_array       100  thrpt   12    53846,906 ?  19241,913  ops/s
> FlatMap.par_array      1000  thrpt   12     8230,909 ?    156,362  ops/s
> FlatMap.par_iterate      10  thrpt   12    26328,500 ?   5411,401  ops/s
> FlatMap.par_iterate     100  thrpt   12    10470,862 ?    249,991  ops/s
> FlatMap.par_iterate    1000  thrpt   12      986,511 ?    224,050  ops/s
> FlatMap.seq_array        10  thrpt   12  5654826,565 ?  27317,453  ops/s
> FlatMap.seq_array       100  thrpt   12   187929,786 ?    542,787  ops/s
> FlatMap.seq_array      1000  thrpt   12     2385,346 ?      9,827  ops/s
> FlatMap.seq_iterate      10  thrpt   12   812722,403 ? 160500,399  ops/s
> FlatMap.seq_iterate     100  thrpt   12    13542,472 ?    118,769  ops/s
> FlatMap.seq_iterate    1000  thrpt   12      157,056 ?      1,814  ops/s
> 
> 
> For streams of size 100k, the following numbers are interesting:
> 
> Before this PR:
> 
> Benchmark            (size)   Mode  Cnt  Score    Error  Units
> FlatMap.par_array    100000  thrpt   12  0,325 ?  0,004  ops/s
> FlatMap.par_iterate  100000  thrpt   12  0,106 ?  0,008  ops/s
> FlatMap.seq_array    100000  thrpt   12  0,173 ?  0,003  ops/s
> FlatMap.seq_iterate  100...

Viktor Klang has updated the pull request incrementally with one additional commit since the last revision:

  More optimization work

-------------

Changes:
  - all: https://git.openjdk.org/jdk/pull/18625/files
  - new: https://git.openjdk.org/jdk/pull/18625/files/3ff40739..d6d35d53

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=18625&range=02
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=18625&range=01-02

  Stats: 135 lines in 4 files changed: 71 ins; 1 del; 63 mod
  Patch: https://git.openjdk.org/jdk/pull/18625.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/18625/head:pull/18625

PR: https://git.openjdk.org/jdk/pull/18625


More information about the core-libs-dev mailing list