Performance of array of non-nullable value objects
Sergey Kuksenko
sergey.kuksenko at oracle.com
Tue Feb 13 22:01:58 UTC 2024
HashMaps on Valhalla were analyzed some time ago:
https://cr.openjdk.org/~skuksenko/valhalla/hashmaps/hash.html
________________________________________
From: valhalla-dev <valhalla-dev-retn at openjdk.org> on behalf of David Witten <vadavidsw at gmail.com>
Sent: Tuesday, February 13, 2024 1:01 PM
To: valhalla-dev at openjdk.org
Subject: Performance of array of non-nullable value objects
First I'd like to thank everyone working on valhalla, it is very exciting!
I was playing around with different hash Map implementations using Build 20-valhalla+20-75<https://download.java.net/java/early_access/valhalla/20/openjdk-20-valhalla+20-75_linux-x64_bin.tar.gz>. I was surprised that get() performance when bins were arrays of primitive classes containing (int hash, K key, V value) performed worse than the normal non-primitive linked-list bins of (int hash, K key, V value, Node next) even when bins were rather large.
Is this expected to be the case for this old early release?
Is this expected to be the case when non-nullable, not-atomicly-updated value objects are officially released?
Is there any guess about when another early release will be available?
The initial size and load factor of the Maps guaranteed that the bins were largish. The random seed was the same for array-bin vs list-bin so that the bins sizes are always same for both. Here is a typical histogram for bin sizes (again same for list vs array bins):
histogram: max: 16, [589, 2436, 4805, 6396, 6342, 5173, 3413, 1889, 1017, 437, 187, 55, 21, 6, 1, 0, 1]
So, for example, there were 2436 bins of size 1.
Here are some results (I started with the jmh tests in https://hg.openjdk.org/valhalla/valhalla/rev/71ba79398dd9 ) but the Map implementations and random seed approach are different.
Benchmark (mapType) (size) Mode Cnt Score Error Units
GetX.getHit mapprotos.ArrayBinHashMapJustPutGet 131072 avgt 10 4784.596 ± 649.247 us/op
GetX.getHit mapprotos.HashMapJustPutGet 131072 avgt 10 3053.680 ± 427.430 us/op
GetX.getMix mapprotos.ArrayBinHashMapJustPutGet 131072 avgt 10 4991.512 ± 292.345 us/op
GetX.getMix mapprotos.HashMapJustPutGet 131072 avgt 10 4291.636 ± 543.059 us/op
If this sort of behavior is not expected, and someone would like to look into it, I can clean up and supply my test.
-thanks, David
More information about the valhalla-dev
mailing list