[
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: [email protected]
For additional commands, e-mail: [email protected]