[ 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:10 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: {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} 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: {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