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

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

I have modified the test that locates the caller class and added a test to 
locate the caller's StackTraceElement using StackWalker using the same 
algorithm Log4j uses. The performance of locating the caller's Class is greatly 
improved from the numbers above and is now faster than using 
Reflection.getCallerClass(). Locating the caller's StackTraceElement is also 
much faster with StackWalker than walking the Throwable. 

I should point out that I tried various methods to locate the caller's class 
and StackTraceElement and finally settled on using the filter method as 
dropWhile() and reduce() were much slower.

{code}
Benchmark                                                              (limit)  
(skip)  Mode  Cnt   Score   Error  Units
StackWalkerGetCallerClass.securityManager                                  N/A  
   N/A  avgt   20   1.478 ± 0.013  us/op
StackWalkerGetCallerClass.stackwalkerGetImmediate                          N/A  
   N/A  avgt   20   1.185 ± 0.012  us/op
StackWalkerGetCallerClass.stackwalkerSearch                                N/A  
   N/A  avgt   20   2.335 ± 0.017  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                             1  
   N/A  avgt   20   2.397 ± 0.043  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                             2  
   N/A  avgt   20   2.424 ± 0.027  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                             4  
   N/A  avgt   20   2.757 ± 0.028  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                             6  
   N/A  avgt   20   3.045 ± 0.031  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                             8  
   N/A  avgt   20   7.804 ± 0.247  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                            10  
   N/A  avgt   20   7.711 ± 0.062  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                            12  
   N/A  avgt   20   7.984 ± 0.038  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                            14  
   N/A  avgt   20   8.537 ± 0.342  us/op
StackWalkerLimitBenchmark.stackWalkerStreamLimit                            16  
   N/A  avgt   20  13.232 ± 0.142  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit            1  
   N/A  avgt   20   2.640 ± 0.049  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit            2  
   N/A  avgt   20   2.514 ± 0.014  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit            4  
   N/A  avgt   20   2.749 ± 0.179  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit            6  
   N/A  avgt   20   2.627 ± 0.015  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit            8  
   N/A  avgt   20   3.368 ± 0.028  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit           10  
   N/A  avgt   20   4.156 ± 0.033  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit           12  
   N/A  avgt   20   4.857 ± 0.093  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit           14  
   N/A  avgt   20   5.461 ± 0.065  us/op
StackWalkerLimitWithEstimatedSizeBenchmark.stackWalkerStreamLimit           16  
   N/A  avgt   20   6.104 ± 0.088  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
     1  avgt   20  12.613 ± 0.046  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
     2  avgt   20  12.705 ± 0.156  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
     4  avgt   20  12.484 ± 0.173  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
     6  avgt   20  12.275 ± 0.063  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
     8  avgt   20  12.552 ± 0.175  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
    10  avgt   20  12.349 ± 0.167  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
    12  avgt   20  12.564 ± 0.153  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
    14  avgt   20  13.128 ± 0.476  us/op
StackWalkerSkipBenchmark.stackWalkerStreamSkip                             N/A  
    16  avgt   20  13.246 ± 0.532  us/op
StackWalkerVsExceptionBenchmark.exceptionStackTrace                        N/A  
   N/A  avgt   20  28.558 ± 0.343  us/op
StackWalkerVsExceptionBenchmark.stackWalkerForEach                         N/A  
   N/A  avgt   20  12.873 ± 0.171  us/op
StackWalkerVsExceptionBenchmark.stackWalkerForEachRetainClass              N/A  
   N/A  avgt   20  12.828 ± 0.236  us/op
StackWalkerVsExceptionBenchmark.stackWalkerForEachToStackTraceElement      N/A  
   N/A  avgt   20  35.724 ± 0.123  us/op
StackWalkerVsExceptionBenchmark.stackwalkerStackTrace                      N/A  
   N/A  avgt   20   3.763 ± 0.022  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