> On May 10, 2016, at 5:17 PM, Ralph Goers <ralph.go...@dslextreme.com> wrote:
> 
> OK - I try that. My  earlier comparison had shown that StackWalker was much 
> faster but since walking the Throwable is so much slower I’m now wondering 
> how much better than Java 7 & 8 it will be.
> 
> Any idea why walking the Throwable is so much slower?
> 

No idea yet.  Can you share your benchmark so that we can understand what you 
measure?  

Mandy

> Ralph
> 
>> On May 10, 2016, at 5:01 PM, Mandy Chung <mandy.ch...@oracle.com> wrote:
>> 
>> This walks the stack to find a frame with a matching class.  
>> Throwable::getStackTrace is taking the entire stack trace.  I suggest to try 
>> StackWalker and avoids the overhead of dumping the entire stack trace.
>> 
>> Mandy
>> 
>>> On May 10, 2016, at 10:40 AM, Ralph Goers <ralph.go...@dslextreme.com> 
>>> wrote:
>>> 
>>> 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