The benchmark logs events using Log4j 2’s asynchronous loggers. In the process 
of doing that it captures the location information using the code below:


// LOG4J2-1029 new Throwable().getStackTrace is faster than 
Thread.currentThread().getStackTrace().
final StackTraceElement[] stackTrace = new Throwable().getStackTrace();
StackTraceElement last = null;
for (int i = stackTrace.length - 1; i > 0; i--) {
    final String className = stackTrace[i].getClassName();
    if (fqcnOfLogger.equals(className)) {
        return last;
    }
    last = stackTrace[i];
}
return null;

Ralph


> On May 10, 2016, at 9:57 AM, Mandy Chung <mandy.ch...@oracle.com> wrote:
> 
> What does your benchmark call?
> 
> Mandy
> 
>> On May 10, 2016, at 9:49 AM, Ralph Goers <ralph.go...@dslextreme.com> wrote:
>> 
>> I just ran one of the Log4j performance tests that specifically captures 
>> location information.  To run the test I do
>> 
>> java -jar log4j-perf/target/benchmarks.jar 
>> ".*AsyncAppenderLog4j2LocationBenchmark.*" -f 1 -wi 10 -i 20 -t 4 -si true
>> 
>> And the results are:
>> 
>> java version "1.7.0_80
>> 
>> Benchmark                                                             Mode  
>> Samples       Score      Error  Units
>> o.a.l.l.p.j.AsyncAppenderLog4j2LocationBenchmark.throughputSimple    thrpt   
>>     20  124819.285 ± 3003.918  ops/s
>> 
>> java version "1.8.0_65"
>> 
>> Benchmark                                                             Mode  
>> Samples       Score      Error  Units
>> o.a.l.l.p.j.AsyncAppenderLog4j2LocationBenchmark.throughputSimple    thrpt   
>>     20  123209.746 ± 3064.672  ops/s
>> 
>> 
>> java version "9-ea"
>> Java(TM) SE Runtime Environment (build 9-ea+116)
>> 
>> Benchmark                                                             Mode  
>> Samples      Score      Error  Units
>> o.a.l.l.p.j.AsyncAppenderLog4j2LocationBenchmark.throughputSimple    thrpt   
>>     20  96090.261 ± 4565.763  ops/s
>> 
>> 
>> This tells me that Java 9 is about 23% slower than previous versions in 
>> walking the stack trace elements.
>> 
>> Ralph
>> 
>>> On Apr 13, 2016, at 12:03 PM, Mandy Chung <mandy.ch...@oracle.com> wrote:
>>> 
>>> If you record all stack frames, I can believe Throwable is faster because 
>>> of a recent optimization JDK-8150778 that has been made in jdk9 to improve 
>>> the Throwable::getStackTraceElements method.
>>> 
>>> Mandy
>>> 
>>>> On Apr 13, 2016, at 11:49 AM, Ralph Goers <ralph.go...@dslextreme.com> 
>>>> wrote:
>>>> 
>>>> I did a raw test of StackWalker by itself and the performance was much 
>>>> better than using a Throwable to get the location information.  However, I 
>>>> haven’t tested how it will be implemented in Log4j.  We still support Java 
>>>> 7 (and will for some time) so we have to find a way to support using 
>>>> StackWalker when running on Java 9 even though we build with Java 7.
>>>> 
>>>> Ralph
>>>> 
>>>>> On Apr 13, 2016, at 10:27 AM, Mandy Chung <mandy.ch...@oracle.com> wrote:
>>>>> 
>>>>> It is good to know Log4J is planning to use StackWalker.
>>>>> 
>>>>> Thanks for the feedback.  I will reconsider.
>>>>> 
>>>>> One thing to mention is the patch went in jdk9/hs-rt that will show up in 
>>>>> jdk9/dev some time that changes the implementation to create 
>>>>> StackTraceElement to get filename and line number.  The object allocation 
>>>>> should be cheap that does create short-lived objects.  The main 
>>>>> motivation of JDK-8153123 was to simplify the hotspot implementation that 
>>>>> the runtime team had concern about. There is an open issue to follow up 
>>>>> the performance (JDK-8153683).  It’d be helpful to get your feedback on 
>>>>> using StackWalker API and the performance data.
>>>>> 
>>>>> Mandy
>>>>> 
>>>>>> On Apr 13, 2016, at 6:51 AM, Ralph Goers <ralph.go...@dslextreme.com> 
>>>>>> wrote:
>>>>>> 
>>>>>> I had planned on using StackWalker to generate the location information 
>>>>>> for every logging event. It seems that this change would thus cause the 
>>>>>> creation of a new StackTraceElement for every logger event. That seems 
>>>>>> wasteful. Log4j is currently in the process of trying to reduce the 
>>>>>> number of objects that are created while logging as it has a significant 
>>>>>> impact on garbage collection. So I am also in favor of getting the 
>>>>>> filename and line number directly from the StackFrame.
>>>>>> 
>>>>>> Ralph
>>>>>> 
>>>>>>> On Apr 12, 2016, at 5:15 PM, Mandy Chung <mandy.ch...@oracle.com> wrote:
>>>>>>> 
>>>>>>> 
>>>>>>>> On Apr 12, 2016, at 1:34 AM, Rémi Forax <fo...@univ-mlv.fr> wrote:
>>>>>>>> 
>>>>>>>> Hi Mandy,
>>>>>>>> I really don't like this patch.
>>>>>>>> 
>>>>>>>> Being forced to call toStackElement to get the line number is counter 
>>>>>>>> intuitive.
>>>>>>>> I would prefer the two methods to not return Optional but an int and a 
>>>>>>>> String with the same convention as StackElement if the point of this 
>>>>>>>> patch is to remove the dependency to Optional. 
>>>>>>>> 
>>>>>>> 
>>>>>>> I was expecting the common usage of StackWalker API does not need file 
>>>>>>> name and line number.  I think it'd be useful to include 
>>>>>>> StackFrame::getBci (in the future it might include live information 
>>>>>>> like locals etc) and keep the optional stuff and uncommon usage to 
>>>>>>> StackTraceElement.
>>>>>>> 
>>>>>>> Mandy
>>>>>>> 
>>>>>>> 
>>>>>>>> Rémi
>>>>>>>> 
>>>>>>>> 
>>>>>>>> Le 11 avril 2016 23:22:39 CEST, Mandy Chung <mandy.ch...@oracle.com> a 
>>>>>>>> écrit :
>>>>>>>>> Webrev at:
>>>>>>>>> http://cr.openjdk.java.net/~mchung/jdk9/webrevs/8153912/webrev.00/index.html
>>>>>>>>> 
>>>>>>>>> StackFrame::getFileName and StackFrame::getLineNumber are originally
>>>>>>>>> proposed with the view of any stack walking code can migrate to the
>>>>>>>>> StackWalker API without the use of StackTraceElement. 
>>>>>>>>> 
>>>>>>>>> File name and line number are useful for debugging and troubleshooting
>>>>>>>>> purpose. It has additional overhead to map from a method and BCI to
>>>>>>>>> look up the file name and line number. 
>>>>>>>>> 
>>>>>>>>> StackFrame::toStackTraceElement method returns StackTraceElement that
>>>>>>>>> includes the file name and line number. There is no particular benefit
>>>>>>>>> to duplicate getFileName and getLineNumber methods in StackFrame. It 
>>>>>>>>> is
>>>>>>>>> equivalently convenient to call
>>>>>>>>> StackFrame.toStackTraceElement().getFileName() (or getLineNumber). 
>>>>>>>>> 
>>>>>>>>> This patch proposes to remove StackFrame::getFileName and
>>>>>>>>> StackFrame::getLineNumber methods since such information can be
>>>>>>>>> obtained from StackFrame.toStackTraceElement().
>>>>>>>>> 
>>>>>>>>> Mandy
>>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>> 
>>>>>> 
>>>>> 
>>>>> 
>>>> 
>>>> 
>>> 
>>> 
>> 
> 
> 

Reply via email to