Slow performance of StackWalker.getCallerClass() vs Reflection.getCallerClass()
Kasper Nielsen
kasperni at gmail.com
Tue Jul 2 13:07:03 UTC 2019
Hi Remi,
Yes, setting up a StackWalker is more or less free. It is just
wrapping a set of options.
public class StackWalkerPerf {
static final StackWalker sw =
StackWalker.getInstance(Option.RETAIN_CLASS_REFERENCE);
@Benchmark
public StackWalker stackWalkerSetup() {
return StackWalker.getInstance(Option.RETAIN_CLASS_REFERENCE);
}
@Benchmark
public Class<?> stackWalkerCallerClass() {
return sw.getCallerClass();
}
@Benchmark
public Lookup reflectionCallerClass() {
return MethodHandles.lookup();
}
}
Benchmark Mode Cnt Score Error Units
StackWalkerPerf.stackWalkerSetup avgt 10 11.958 ± 0.353 ns/op
StackWalkerPerf.reflectionCallerClass avgt 10 8.511 ± 0.415 ns/op
StackWalkerPerf.stackWalkerCallerClass avgt 10 1269.825 ± 66.471 ns/op
I'm using MethodHandles.lookup() in this test because it is cheapest
way to invoke Reflection.getCallerClass() without any tricks.
So real performance is likely better.
/Kasper
On Tue, 2 Jul 2019 at 13:53, Remi Forax <forax at univ-mlv.fr> wrote:
>
> Hi Kasper,
> did you store the StackWalker instance in a static final field ?
>
> Rémi
>
> ----- Mail original -----
> > De: "Kasper Nielsen" <kasperni at gmail.com>
> > À: "core-libs-dev" <core-libs-dev at openjdk.java.net>
> > Envoyé: Mardi 2 Juillet 2019 11:09:11
> > Objet: Slow performance of StackWalker.getCallerClass() vs Reflection.getCallerClass()
>
> > Hi,
> >
> > Are there any security reasons for why StackWalker.getCallerClass()
> > cannot be made as performant as Reflection.getCallerClass()?
> > StackWalker.getCallerClass() is at least 100 times slower then
> > Reflection.getCallerClass() (~1000 ns/op vs ~10 ns/op).
> >
> > I'm trying to retrofit some existing APIs where I cannot take a Lookup
> > object to do some access control checks.
> > But the performance of StackWalker.getCallerClass() is making it impossible.
> >
> > Best
> > Kasper
More information about the core-libs-dev
mailing list