RFR(xs): 8244733: Add ResourceHashtable::compute_if_absent
Thomas Stüfe
thomas.stuefe at gmail.com
Tue May 12 06:40:55 UTC 2020
Thank you David.
I'll go and fix callsites and then we will see if additional functions are
needed.
Cheers, Thomas
On Tue, May 12, 2020 at 8:38 AM David Holmes <david.holmes at oracle.com>
wrote:
> 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