----- 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 ?

> 
> /Kasper

Rémi

Reply via email to