> On Mar 12, 2017, at 9:25 PM, Ralph Goers <[email protected]> wrote:
> 
> Sorry for not getting back sooner but I finally found some time to follow up.
> 
> I took a look at 
> https://www.sitepoint.com/deep-dive-into-java-9s-stack-walking-api/ 
> <https://www.sitepoint.com/deep-dive-into-java-9s-stack-walking-api/> and 
> modified the benchmarks that were used there to add a few more use cases. I 
> also created a small set of benchmarks for Java 8 to compare it against.  The 
> resulting project is at 
> https://github.com/rgoers/stackwalker-vs-Reflection_getCallerClass/tree/master/java9
>  
> <https://github.com/rgoers/stackwalker-vs-Reflection_getCallerClass/tree/master/java9>.
>   I’ve summarized the results in 
> https://issues.apache.org/jira/browse/LOG4J2-1359 
> <https://issues.apache.org/jira/browse/LOG4J2-1359>, but for your convenience 
> here are the bullet points:
> 
> 1. Walking the Throwable StackTraceElements is significantly faster in Java 8 
> than Java 9. I am not sure what benchmark Brent used but my results differ.

I’ll be surprised if jdk 9 Throwable is slower than jdk 8 as JDK-8150778 should 
give some improvement.

We will look into it.

> 2. Using StackWalker to get the StackTraceElements in Java 9 is almost twice 
> as slow as walking the Throwable in Java 8. (Log4j relied on this pre-Java9 
> and apparently will have to continue to do so, but it will now be slower).
> 3. Using StackWalker to search for the caller's class is about twice as slow 
> as sun.reflect.Reflection.getCallerClass() was (Log4j requires this and it is 
> going to hurt performance).

This of course needs to look at the difference between our benchmarks and yours 
and understands show the  perf gap.  There is of course room for performance 
tuning.

> 4. sun.reflect.Reflection.getCallerClass is about 10 times faster than using 
> StackWalker.getCallerClass to obtain the Class object of the immediate caller.

Does Log4J look at the immediate caller? AFAIU, the libraries are depending 
sun.reflect.Reflection.getCallerClass(int).   One use case of logging is to 
filter the logging implementation frames and find the first caller after 
filtering several frames.  We have tuned the performance for such use case.  
For getting the immediate caller, we expect most existing code using 
Reflection::getCallerClass will call StalkWalker::walk but not 
getCallerClass().  It’s slower but I’m surprised of this number.

Mandy

Reply via email to