RFR(xs): 8244733: Add ResourceHashtable::compute_if_absent
David Holmes
david.holmes at oracle.com
Tue May 12 06:38:08 UTC 2020
Sorry ignore this.
There are different tradeoffs with different patterns in relation to
computing the value conditionally or unconditionally.
Consider this reviewed.
Thanks,
David
-----
On 12/05/2020 4:32 pm, David Holmes wrote:
> On 12/05/2020 3:15 pm, Thomas Stüfe wrote:
>> On Tue, May 12, 2020 at 7:00 AM David Holmes <david.holmes at oracle.com
>> <mailto:david.holmes at oracle.com>> wrote:
>>
>> Hi Thomas,
>>
>> On 12/05/2020 2:25 pm, Thomas Stüfe wrote:
>> > Hi all,
>> >
>> > May I please have reviews for this enhancement:
>> >
>> > JBS: https://bugs.openjdk.java.net/browse/JDK-8244733
>> > Webrev:
>> >
>>
>> http://cr.openjdk.java.net/~stuefe/webrevs/8244733--add-resourcehashtable--compute_if_absent/webrev.00/webrev/
>>
>> >
>> > A common pattern when using ResourceHashTable is:
>> >
>> > if (table.get(k) == NULL) table.add(k,v);
>> >
>> > This runs the lookup code twice. By providing a new method which
>> combines
>> > these two operations we would save one lookup.
>> >
>> > The new method is named ResourceHashTable::compute_if_absent()
>> and behaves
>> > very similar to the similarly named variant in j.u.Map.
>>
>> The code to replace the pattern above would be putIfAbsent. The
>> general
>> motivation for computeIfAbsent is to avoid the execution of an
>> expensive
>> mapping function if the mapping already exists. Perhaps you need
>> both?
>>
>>
>> The places I had in mind (ClassLoaderStats, CDS) all needed a
>> computeIfAbsent. I have not seen any places which would benefit from a
>> putIfAbsent, but I can look again.
>
> Okay but the "common pattern" you used to motivate this matches
> putIfAbsent not computeIfAbsent. That pattern would require the
> introduction of a compute function object to use computeIfAbsent - as
> per your 8244777 example code. Stylistically I find the need to
> introduction a function object just to use this API somewhat grating.
>
>> I would like to avoid adding functions proactively though. In my mind
>> putIfAbsent is less useful than computeIfAbsent, only to be preferred
>> if construction needs more information than a mapping function can
>> provide.
>
> I would flip that around and say that computeIfAbsent is only useful if
> concurrent puts are possible and you want to avoid computing the new
> value unnecessarily in each case. I'm not clear from the potential
> call-sites whether concurrent puts are in issue here or not - but if not
> then putIfAbsent is all you need.
>
> David
>
>> Thanks, Thomas
>>
>> David
>>
>> > Note: Actually replacing caller code will happen in a separate
>> RFE. The
>> > first caller to use this will be the ClassLoaderStats VM
>> operation - I was
>> > able to significantly reduce runtime for that vm op. But since
>> that is JFR
>> > territory and this is more of a runtime topic I wanted to keep
>> the review
>> > separate.
>> >
>> > Thanks, Thomas
>> >
>>
More information about the hotspot-runtime-dev
mailing list