[ 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:12 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.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-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