Hi Mike

Zitat von "David Holmes" <david.hol...@oracle.com>:

Patrick - this is why you idea doesn't really provide the answer, there
is still a StringBuilder created for each line of stack trace printed,
and probably a resize as the line is probably > 16 chars, as well as 2
writes for each line

Ups, I missed the toString() part of the StackTraceElement - shame on me :-)

What if you would define a java.lang.Appendable implementation instead of
StringBuilder in your StackStraceElement.appendTo() method. You would then be
able to write the Throwable print stacktrace methods it this way:

      for (StackTraceElement traceElement : trace)
          s.append("\tat ");
          tranceElement.appendTo(s);
          s.println();

and Similarly for:

      for (int i = 0; i <= m; i++)
          s.append(prefix).append("\tat ");
          tranceElement.appendTo(trace[i]);
          s.println();


In this case you would pass the actual PrintStream/Writer instance instead of
creating new StringBuilders at all and your toString() method using a new
StringBuilder still would work the same way.

Or did I still miss something?

Cheers,

Patrick "Reini" Reinhart



Ah I see. I missed the key point that you now use a single SB across the entire process of printing the stacktrace. I guess my only additional comment on that is that it would seem to be be a good idea to increase the initial size of that single SB as it is likely to grow on its very first use.

Also a minor gain might be had to change println(sb) to be println(sb.toString()) and avoid the String.valueOf intermediate call (and null check).

Aside: can't help but feel that the streams should directly support CharSequences so that we don't need to convert to intermediate Strings.


Cheers,
David



Reply via email to