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

Ralph Goers edited comment on LOG4J2-1359 at 3/13/17 5:21 AM:
--------------------------------------------------------------

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 1.8.0_65-b17:
{code}
Benchmark                                        Mode  Cnt   Score   Error  
Units
ExceptionBenchmark.exceptionStackTrace           avgt   20  19.260 ± 0.385  
us/op
StackWalkerGetCallerClass.exceptionGetImmediate  avgt   20   0.132 ± 0.001  
us/op
StackWalkerGetCallerClass.reflectionSearch       avgt   20   3.703 ± 0.048  
us/op
StackWalkerGetCallerClass.securityManager        avgt   20   0.905 ± 0.007  
us/op
{code}

Java 9-ea+160:
{code}
Benchmark                                                              (limit)  
(skip)  Mode  Cnt   Score   Error  Units
StackWalkerGetCallerClass.securityManager                                  N/A  
   N/A  avgt   20   1.554 ± 0.089  us/op
StackWalkerGetCallerClass.stackwalkerGetImmediate                          N/A  
   N/A  avgt   20   1.178 ± 0.013  us/op
StackWalkerGetCallerClass.stackwalkerSearch                                N/A  
   N/A  avgt   20   5.969 ± 0.055  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                             1  
   N/A  avgt   20   2.331 ± 0.015  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                             2  
   N/A  avgt   20   2.384 ± 0.017  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                             4  
   N/A  avgt   20   2.617 ± 0.021  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                             6  
   N/A  avgt   20   2.799 ± 0.025  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                             8  
   N/A  avgt   20   7.082 ± 0.056  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                            10  
   N/A  avgt   20   7.093 ± 0.122  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                            12  
   N/A  avgt   20   7.297 ± 0.039  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                            14  
   N/A  avgt   20   7.477 ± 0.061  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                            16  
   N/A  avgt   20  11.789 ± 0.079  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit            1  
   N/A  avgt   20   2.290 ± 0.016  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit            2  
   N/A  avgt   20   2.253 ± 0.020  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit            4  
   N/A  avgt   20   2.481 ± 0.082  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit            6  
   N/A  avgt   20   2.442 ± 0.060  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit            8  
   N/A  avgt   20   3.151 ± 0.036  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit           10  
   N/A  avgt   20   3.854 ± 0.040  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit           12  
   N/A  avgt   20   4.554 ± 0.055  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit           14  
   N/A  avgt   20   5.139 ± 0.060  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit           16  
   N/A  avgt   20   5.846 ± 0.085  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
     1  avgt   20  12.020 ± 0.087  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
     2  avgt   20  11.995 ± 0.061  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
     4  avgt   20  12.273 ± 0.180  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
     6  avgt   20  12.076 ± 0.122  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
     8  avgt   20  12.143 ± 0.130  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
    10  avgt   20  12.164 ± 0.133  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
    12  avgt   20  12.335 ± 0.280  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
    14  avgt   20  11.849 ± 0.070  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
    16  avgt   20  11.984 ± 0.145  us/op
StackWalkerVsExceptionBenchmark.exceptionStackTrace                        N/A  
   N/A  avgt   20  28.253 ± 0.782  us/op
StackWalkerVsExceptionBenchmark.stackWalkerForEach                         N/A  
   N/A  avgt   20  12.084 ± 0.113  us/op
StackWalkerVsExceptionBenchmark.stackWalkerForEachRetainClass              N/A  
   N/A  avgt   20  12.093 ± 0.144  us/op
StackWalkerVsExceptionBenchmark.stackWalkerForEachToStackTraceElement      N/A  
   N/A  avgt   20  33.717 ± 0.312  us/op
{code}


was (Author: ralph.go...@dslextreme.com):
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 1.8.0_65-b17:
{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-ea+160:
{code}
Benchmark                                                              (limit)  
(skip)  Mode  Cnt   Score   Error  Units
StackWalkerGetCallerClass.securityManager                                  N/A  
   N/A  avgt   20   1.554 ± 0.089  us/op
StackWalkerGetCallerClass.stackwalkerGetImmediate                          N/A  
   N/A  avgt   20   1.178 ± 0.013  us/op
StackWalkerGetCallerClass.stackwalkerSearch                                N/A  
   N/A  avgt   20   5.969 ± 0.055  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                             1  
   N/A  avgt   20   2.331 ± 0.015  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                             2  
   N/A  avgt   20   2.384 ± 0.017  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                             4  
   N/A  avgt   20   2.617 ± 0.021  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                             6  
   N/A  avgt   20   2.799 ± 0.025  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                             8  
   N/A  avgt   20   7.082 ± 0.056  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                            10  
   N/A  avgt   20   7.093 ± 0.122  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                            12  
   N/A  avgt   20   7.297 ± 0.039  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                            14  
   N/A  avgt   20   7.477 ± 0.061  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                            16  
   N/A  avgt   20  11.789 ± 0.079  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit            1  
   N/A  avgt   20   2.290 ± 0.016  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit            2  
   N/A  avgt   20   2.253 ± 0.020  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit            4  
   N/A  avgt   20   2.481 ± 0.082  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit            6  
   N/A  avgt   20   2.442 ± 0.060  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit            8  
   N/A  avgt   20   3.151 ± 0.036  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit           10  
   N/A  avgt   20   3.854 ± 0.040  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit           12  
   N/A  avgt   20   4.554 ± 0.055  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit           14  
   N/A  avgt   20   5.139 ± 0.060  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit           16  
   N/A  avgt   20   5.846 ± 0.085  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
     1  avgt   20  12.020 ± 0.087  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
     2  avgt   20  11.995 ± 0.061  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
     4  avgt   20  12.273 ± 0.180  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
     6  avgt   20  12.076 ± 0.122  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
     8  avgt   20  12.143 ± 0.130  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
    10  avgt   20  12.164 ± 0.133  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
    12  avgt   20  12.335 ± 0.280  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
    14  avgt   20  11.849 ± 0.070  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
    16  avgt   20  11.984 ± 0.145  us/op
StackWalkerVsExceptionBenchmark.exceptionStackTrace                        N/A  
   N/A  avgt   20  28.253 ± 0.782  us/op
StackWalkerVsExceptionBenchmark.stackWalkerForEach                         N/A  
   N/A  avgt   20  12.084 ± 0.113  us/op
StackWalkerVsExceptionBenchmark.stackWalkerForEachRetainClass              N/A  
   N/A  avgt   20  12.093 ± 0.144  us/op
StackWalkerVsExceptionBenchmark.stackWalkerForEachToStackTraceElement      N/A  
   N/A  avgt   20  33.717 ± 0.312  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