[ 
https://issues.apache.org/jira/browse/LOG4J2-1359?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15906837#comment-15906837
 ] 

Ralph Goers commented on LOG4J2-1359:
-------------------------------------

I have copied the benchmarks from the sitepoint article and modified them 
slightly and added benchmarks for java 8. The project is at 
https://github.com/rgoers/stackwalker-vs-Reflection_getCallerClass. The results 
on my machine are below. The take-aways are:
1. Walking the Throwable StackTraceElements is significantly faster in Java 8 
than Java 9, so my memory is correct.
2. Using StackWalker to get the StackTraceElements is almost twice as slow as 
walking the Throwable in Java 8.
3. Using StackWalker to search for the caller's class is about twice as slow as 
sun.reflect.Reflection.getCallerClass() was.
4. sun.reflect.Reflection.getCallerClass is about 10 times faster than using 
StackWalker.getCallerClass to obtain the Class object of the immediate caller.

In short it appears that the performance of StackWalker means that we are going 
to want to avoid using it.

Java 8:
{code}
Benchmark                                        Mode  Cnt   Score   Error  
Units
ExceptionBenchmark.exceptionStackTrace           avgt   20  19.796 ± 0.405  
us/op
StackWalkerGetCallerClass.exceptionGetImmediate  avgt   20   0.135 ± 0.002  
us/op
StackWalkerGetCallerClass.reflectionSearch       avgt   20   3.844 ± 0.057  
us/op
StackWalkerGetCallerClass.securityManager        avgt   20   0.949 ± 0.013  
us/op
{code}

Java 9:
{code}
Benchmark                                                              (limit)  
(skip)  Mode  Cnt   Score   Error  Units
StackWalkerGetCallerClass.securityManager                                  N/A  
   N/A  avgt   20   1.498 ± 0.014  us/op
StackWalkerGetCallerClass.stackwalkerGetImmediate                          N/A  
   N/A  avgt   20   1.124 ± 0.009  us/op
StackWalkerGetCallerClass.stackwalkerSearch                                N/A  
   N/A  avgt   20   7.083 ± 0.723  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                             1  
   N/A  avgt   20   2.640 ± 0.318  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                             2  
   N/A  avgt   20   2.635 ± 0.214  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                             4  
   N/A  avgt   20   2.779 ± 0.284  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                             6  
   N/A  avgt   20   3.051 ± 0.274  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                             8  
   N/A  avgt   20   7.555 ± 0.902  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                            10  
   N/A  avgt   20   7.824 ± 0.965  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                            12  
   N/A  avgt   20  12.369 ± 6.191  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                            14  
   N/A  avgt   20   8.861 ± 2.315  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                            16  
   N/A  avgt   20  13.643 ± 1.141  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit            1  
   N/A  avgt   20   2.754 ± 0.367  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit            2  
   N/A  avgt   20   2.669 ± 0.386  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit            4  
   N/A  avgt   20   2.722 ± 0.274  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit            6  
   N/A  avgt   20   2.812 ± 0.222  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit            8  
   N/A  avgt   20   3.555 ± 0.532  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit           10  
   N/A  avgt   20   4.259 ± 0.493  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit           12  
   N/A  avgt   20   6.149 ± 5.423  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit           14  
   N/A  avgt   20   5.707 ± 0.629  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit           16  
   N/A  avgt   20   6.336 ± 0.928  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
     1  avgt   20  13.079 ± 0.991  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
     2  avgt   20  13.321 ± 1.130  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
     4  avgt   20  13.379 ± 1.243  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
     6  avgt   20  13.054 ± 1.193  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
     8  avgt   20  13.041 ± 0.764  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
    10  avgt   20  13.359 ± 0.659  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
    12  avgt   20  12.941 ± 1.195  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
    14  avgt   20  13.212 ± 1.131  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
    16  avgt   20  13.737 ± 2.162  us/op
StackWalkerVsExceptionBenchmark.exceptionStackTrace                        N/A  
   N/A  avgt   20  28.247 ± 0.461  us/op
StackWalkerVsExceptionBenchmark.stackWalkerForEach                         N/A  
   N/A  avgt   20  13.589 ± 1.477  us/op
StackWalkerVsExceptionBenchmark.stackWalkerForEachRetainClass              N/A  
   N/A  avgt   20  13.391 ± 1.032  us/op
StackWalkerVsExceptionBenchmark.stackWalkerForEachToStackTraceElement      N/A  
   N/A  avgt   20  35.373 ± 1.311  us/op{code}

> Add support for Java 9 StackWalker API in ReflectionUtil
> --------------------------------------------------------
>
>                 Key: LOG4J2-1359
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-1359
>             Project: Log4j 2
>          Issue Type: Improvement
>          Components: API
>         Environment: Java 1.9+
>            Reporter: Matt Sicker
>            Assignee: Ralph Goers
>              Labels: jdk9
>
> [StackWalker|http://download.java.net/jdk9/docs/api/java/lang/StackWalker.html]
> Based on the functional nature of this API, supporting it may require 
> compiling at least one class using javac 1.9 and reflectively loading it in 
> ReflectionUtil similar to how Spring supports newer JDK APIs.
> Without support for StackWalker, ReflectionUtil will fall back to using a 
> slower API in Java 1.9. This is because the Reflection class is a 
> sun-internal class which are no longer exported to non-JDK code without 
> setting special command line flags.



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscr...@logging.apache.org
For additional commands, e-mail: log4j-dev-h...@logging.apache.org

Reply via email to