RFR: 8156071: List.of: reduce array copying during creation
Stuart Marks
smarks at openjdk.java.net
Fri Oct 2 19:45:36 UTC 2020
On Thu, 1 Oct 2020 00:13:28 GMT, Stuart Marks <smarks at openjdk.org> wrote:
> Plumb new internal static factory method to trust the array passed in, avoiding unnecessary copying. JMH results for
> the benchmark show about 15% improvement for the cases that were optimized, namely the 3 to 10 fixed arg cases.
> # VM options: -verbose:gc -XX:+UseParallelGC -Xms4g -Xmx4g --enable-preview -verbose:gc -XX:+UsePara
> llelGC -Xms4g -Xmx4g -Xint
> # Warmup: 5 iterations, 1 s each
> # Measurement: 5 iterations, 2 s each
>
> WITHOUT varargs optimization:
>
> Benchmark Mode Cnt Score Error Units
> ListArgs.list00 thrpt 15 6019.539 ± 144.040 ops/ms
> ListArgs.list01 thrpt 15 1985.009 ± 40.606 ops/ms
> ListArgs.list02 thrpt 15 1854.812 ± 17.488 ops/ms
> ListArgs.list03 thrpt 15 963.866 ± 10.262 ops/ms
> ListArgs.list04 thrpt 15 908.116 ± 6.278 ops/ms
> ListArgs.list05 thrpt 15 848.607 ± 16.701 ops/ms
> ListArgs.list06 thrpt 15 822.282 ± 8.905 ops/ms
> ListArgs.list07 thrpt 15 780.057 ± 11.214 ops/ms
> ListArgs.list08 thrpt 15 745.295 ± 19.204 ops/ms
> ListArgs.list09 thrpt 15 704.596 ± 14.003 ops/ms
> ListArgs.list10 thrpt 15 696.436 ± 4.914 ops/ms
> ListArgs.list11 thrpt 15 661.908 ± 11.041 ops/ms
>
> WITH varargs optimization:
>
> Benchmark Mode Cnt Score Error Units
> ListArgs.list00 thrpt 15 6172.298 ± 62.736 ops/ms
> ListArgs.list01 thrpt 15 1987.724 ± 45.468 ops/ms
> ListArgs.list02 thrpt 15 1843.419 ± 10.693 ops/ms
> ListArgs.list03 thrpt 15 1126.946 ± 30.952 ops/ms
> ListArgs.list04 thrpt 15 1050.440 ± 17.859 ops/ms
> ListArgs.list05 thrpt 15 999.275 ± 23.656 ops/ms
> ListArgs.list06 thrpt 15 948.844 ± 19.615 ops/ms
> ListArgs.list07 thrpt 15 897.541 ± 15.531 ops/ms
> ListArgs.list08 thrpt 15 853.359 ± 18.755 ops/ms
> ListArgs.list09 thrpt 15 826.394 ± 8.284 ops/ms
> ListArgs.list10 thrpt 15 779.231 ± 4.104 ops/ms
> ListArgs.list11 thrpt 15 650.888 ± 3.948 ops/ms
After a hint from @cl4es I ran the benchmarks with `-prof gc`. The allocation rate is reduced by about 40% per
operation in the cases where the optimization was applied.
WITHOUT varargs optimization:
ListArgs.list00:·gc.alloc.rate.norm thrpt 5 ≈ 10⁻⁴ B/op
ListArgs.list01:·gc.alloc.rate.norm thrpt 5 24.000 ± 0.001 B/op
ListArgs.list02:·gc.alloc.rate.norm thrpt 5 24.000 ± 0.001 B/op
ListArgs.list03:·gc.alloc.rate.norm thrpt 5 80.000 ± 0.001 B/op
ListArgs.list04:·gc.alloc.rate.norm thrpt 5 80.036 ± 0.309 B/op
ListArgs.list05:·gc.alloc.rate.norm thrpt 5 96.037 ± 0.316 B/op
ListArgs.list06:·gc.alloc.rate.norm thrpt 5 96.038 ± 0.326 B/op
ListArgs.list07:·gc.alloc.rate.norm thrpt 5 112.042 ± 0.361 B/op
ListArgs.list08:·gc.alloc.rate.norm thrpt 5 112.043 ± 0.367 B/op
ListArgs.list09:·gc.alloc.rate.norm thrpt 5 128.045 ± 0.385 B/op
ListArgs.list10:·gc.alloc.rate.norm thrpt 5 128.046 ± 0.391 B/op
ListArgs.list11:·gc.alloc.rate.norm thrpt 5 144.047 ± 0.406 B/op
WITH varargs optimization:
ListArgs.list00:·gc.alloc.rate.norm thrpt 5 ≈ 10⁻⁴ B/op
ListArgs.list01:·gc.alloc.rate.norm thrpt 5 24.000 ± 0.001 B/op
ListArgs.list02:·gc.alloc.rate.norm thrpt 5 24.000 ± 0.001 B/op
ListArgs.list03:·gc.alloc.rate.norm thrpt 5 48.000 ± 0.001 B/op
ListArgs.list04:·gc.alloc.rate.norm thrpt 5 48.000 ± 0.001 B/op
ListArgs.list05:·gc.alloc.rate.norm thrpt 5 56.000 ± 0.001 B/op
ListArgs.list06:·gc.alloc.rate.norm thrpt 5 56.000 ± 0.001 B/op
ListArgs.list07:·gc.alloc.rate.norm thrpt 5 64.000 ± 0.001 B/op
ListArgs.list08:·gc.alloc.rate.norm thrpt 5 64.000 ± 0.001 B/op
ListArgs.list09:·gc.alloc.rate.norm thrpt 5 72.000 ± 0.001 B/op
ListArgs.list10:·gc.alloc.rate.norm thrpt 5 72.000 ± 0.001 B/op
ListArgs.list11:·gc.alloc.rate.norm thrpt 5 144.050 ± 0.427 B/op
-------------
PR: https://git.openjdk.java.net/jdk/pull/449
More information about the security-dev
mailing list