RFR: 8302315: Examine cost of clone of primitive arrays compared to arraycopy
Claes Redestad
redestad at openjdk.org
Fri Feb 17 10:23:53 UTC 2023
On Fri, 17 Feb 2023 09:58:54 GMT, Claes Redestad <redestad at openjdk.org> wrote:
> During work on #12453 @schlosna reported that `array.clone()` might underperform `System.arraycopy` in microbenchmarks and I opted to go with `arraycopy` throughout while investigating.
>
> Testing on x86 (SandyBridge, AVX2) I observe no difference at all between the setups. On aarch the only difference I can observe is that arraycopy seem curiously slow for input size = 0, otherwise no statistically significant difference. All tests ran on builds from JDK mainline and 21-b9.
>
> Since the reported difference was small and mostly visible on very large arrays I conclude that the maintainability win we get from using `clone()` is preferable. I've added the microbenchmark provided by @schlosna here.
osx-aarch64:
Benchmark (size) Mode Cnt Score Error Units
ArrayClone.byteArraycopy 0 avgt 15 9,517 ± 1,272 ns/op
ArrayClone.byteArraycopy 10 avgt 15 5,933 ± 0,314 ns/op
ArrayClone.byteArraycopy 100 avgt 15 4,802 ± 0,234 ns/op
ArrayClone.byteArraycopy 1000 avgt 15 24,671 ± 0,437 ns/op
ArrayClone.byteClone 0 avgt 15 2,417 ± 0,016 ns/op
ArrayClone.byteClone 10 avgt 15 2,924 ± 0,027 ns/op
ArrayClone.byteClone 100 avgt 15 4,563 ± 0,050 ns/op
ArrayClone.byteClone 1000 avgt 15 24,737 ± 0,262 ns/op
ArrayClone.intArraycopy 0 avgt 15 8,156 ± 2,148 ns/op
ArrayClone.intArraycopy 10 avgt 15 3,646 ± 0,025 ns/op
ArrayClone.intArraycopy 100 avgt 15 11,430 ± 0,087 ns/op
ArrayClone.intArraycopy 1000 avgt 15 106,174 ± 0,721 ns/op
ArrayClone.intClone 0 avgt 15 2,455 ± 0,159 ns/op
ArrayClone.intClone 10 avgt 15 3,621 ± 0,013 ns/op
ArrayClone.intClone 100 avgt 15 11,648 ± 0,454 ns/op
ArrayClone.intClone 1000 avgt 15 106,469 ± 1,295 ns/op
linux-x64, sandybridge, avx2:
Benchmark (size) Mode Cnt Score Error Units
ArrayClone.byteArraycopy 0 avgt 15 3.321 ± 0.194 ns/op
ArrayClone.byteArraycopy 10 avgt 15 6.953 ± 0.329 ns/op
ArrayClone.byteArraycopy 100 avgt 15 13.490 ± 0.595 ns/op
ArrayClone.byteArraycopy 1000 avgt 15 150.201 ± 3.451 ns/op
ArrayClone.byteClone 0 avgt 15 5.431 ± 0.252 ns/op
ArrayClone.byteClone 10 avgt 15 6.370 ± 0.329 ns/op
ArrayClone.byteClone 100 avgt 15 13.561 ± 0.633 ns/op
ArrayClone.byteClone 1000 avgt 15 150.300 ± 5.318 ns/op
ArrayClone.intArraycopy 0 avgt 15 3.297 ± 0.226 ns/op
ArrayClone.intArraycopy 10 avgt 15 7.171 ± 0.354 ns/op
ArrayClone.intArraycopy 100 avgt 15 60.863 ± 1.580 ns/op
ArrayClone.intArraycopy 1000 avgt 15 557.770 ± 15.107 ns/op
ArrayClone.intClone 0 avgt 15 5.373 ± 0.225 ns/op
ArrayClone.intClone 10 avgt 15 6.965 ± 0.293 ns/op
ArrayClone.intClone 100 avgt 15 61.696 ± 1.983 ns/op
ArrayClone.intClone 1000 avgt 15 552.809 ± 14.358 ns/op
-------------
PR: https://git.openjdk.org/jdk/pull/12613
More information about the core-libs-dev
mailing list