<i18n dev> RFR: 8345668: ZoneOffset.ofTotalSeconds performance regression [v3]

Chen Liang liach at openjdk.org
Sat Dec 21 00:45:35 UTC 2024


On Fri, 20 Dec 2024 23:59:30 GMT, Shaojin Wen <swen at openjdk.org> wrote:

>> Hi Shaojin,
>> Thanks for the suggestion, but I am not planning to improve the code more than backing out the offending fix at this time. (btw, cache size would be 149 as 18:00 and -18:00 are inclusive)
>
> Can I submit a PR to make this improvement?

@wenshao I agree with your proposal. Also for this part:

ZoneOffset result = MINUTES_15_CACHE.get(cacheIndex);
if (result == null) {
    result = new ZoneOffset(totalSeconds);
    if (!MINUTES_15_CACHE.compareAndSet(cacheIndex, null, result)) {
        result = MINUTES_15_CACHE.get(minutes15Rem);
    }
}


I recommend a rewrite:


ZoneOffset result = MINUTES_15_CACHE.getPlain(cacheIndex);
if (result == null) {
    result = new ZoneOffset(totalSeconds);
    ZoneOffset existing = MINUTES_15_CACHE.compareAndExchange(cacheIndex, null, result);
    return existing == null ? result : existing;
}


The `getPlain` is safe because `ZoneOffset` is thread safe, so you can use the object when you can observe a `ZoneOffset` object reference.  Also `compareAndExchange` avoids extra operations if we failed to racily set the computed `ZoneOffset`.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/22854#discussion_r1894520408


More information about the i18n-dev mailing list