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