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 >>>>> >>>> >>>> >>> >>> >> >> > >