On Thu, 7 Apr 2022 at 13:33, Remi Forax <fo...@univ-mlv.fr> wrote:

> ----- Original Message -----
> > From: "Kasper Nielsen" <kaspe...@gmail.com>
> > To: "Ceki Gülcü" <c...@qos.ch>
> > Cc: "core-libs-dev" <core-libs-dev@openjdk.java.net>
> > Sent: Thursday, April 7, 2022 1:53:33 PM
> > Subject: Re: fast way to infer caller
>
> >>
> >> MethodHandles.lookup().lookupClass() looks very promising except that
> >> there is no way to specify the depth.
> >>
> >> I am looking for a method to obtain the Nth caller at a cost of around
> >> 100 to 200 nanoseconds of CPU time.  Do you think the JDK could cater
> >> for this use case?
> >>
> >
> > Hi Ceki,
> >
> > I don't think you will find the numbers you are looking for with
> > StackWalker.
> > Compared to something like Reflection.getCallerClass() which
> > MethodHandles.lookup() uses.
> > There is still a very large (>100x) performance gap between the two.
> >
> > public class StackWalkerPerf {
> >
> >    static final StackWalker sw =
> > StackWalker.getInstance(Option.RETAIN_CLASS_REFERENCE);
> >
> >    @Benchmark
> >    public Class<?> stackWalkerCallerClass() {
> >        return sw.getCallerClass();
> >    }
> >
> >    @Benchmark
> >    public Class<?> reflectionCallerClass() {
> >        return MethodHandles.lookup().lookupClass();
> >    }
> > }
> >
> > Benchmark                               Mode  Cnt     Score    Error
> Units
> > StackWalkerPerf.reflectionCallerClass   avgt   10    2,927 ± 0,012  ns/op
> > StackWalkerPerf.stackWalkerCallerClass  avgt   10  915,287 ± 9,565  ns/op
>
> > The resulting class is not the same, so comparing the performance of two
> codes that does not do the same thing is dubious, no ?


I think it is a fair test. MethodHandles.lookup() is basically just
wrapping Reflection.getCallerClass(). So if anything
calling Reflection.getCallerClass() directly would be even faster than
calling MethodHandles.lookup().lookupClass();

/Kasper

Reply via email to