<i18n dev> RFR: 8301552: Use AtomicReferenceArray for caching instead of CHM in ZoneOffset

Viktor Klang duke at openjdk.org
Wed Feb 1 07:14:55 UTC 2023


On Tue, 31 Jan 2023 16:02:07 GMT, Per Minborg <pminborg at openjdk.org> wrote:

>> `ZoneOffset` instances are cached by the `ZoneOffset` class itself for values in the range [-18h, 18h] for each second that is on an even quarter of an hour (i.e. at most 2*18*4+1 = 145 values). 
>> 
>> Instead of using a `ConcurrentHashMap` for caching instanced, we could instead use an `AtomicReferenceArray` with direct slot value access for said even seconds. This will improve performance and reduce the number of object even though the backing array will go from an initial 32 in the CHM to an initial/final 145 in the ARA. The CHM will contain much more objects and array slots for typical numbers of entries in the cache and will compute hash/bucket/collision on the hot code path for each cache access.
>
> src/java.base/share/classes/java/time/ZoneOffset.java line 432:
> 
>> 430:         if (totalSeconds % (15 * SECONDS_PER_MINUTE) == 0) {
>> 431:             int slot = cacheSlot(totalSeconds);
>> 432:             ZoneOffset cached = SECONDS_CACHE.get(slot);
> 
> I miss `AtomicReferenceArray::computeIfNull` that atomically will compute an element if the value at a certain index is `null`.

@minborg You could compareAndExchange in a CompletableFuture—if you succeed you can complete it with the computation (bonus points since the computation can be done async) and if you fail you get either a value or a CompletableFuture you can decide if you want to block on it, and for how long?

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

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


More information about the i18n-dev mailing list