On Mon, 1 Aug 2022 16:20:25 GMT, David Schlosnagle <d...@openjdk.org> wrote:

>> If the objective of this patch is to optimise 
>> `StackTraceElement::toString()`, then I would suggest the most efficient 
>> method of calculating the length and encoding of the result, filling the 
>> backing buffer then using the package-private constructor of 
>> `java.lang.String` to construct the final result.
>> 
>> And if you want to propose exposing 
>> `StackTraceElement::appendTo(Appendable)`, then I think it should be a 
>> separate patch instead.
>> 
>> Thanks.
>
> Thanks for the reviews and comments! To @merykitty 's point, I am now 
> focusing this PR on optimizing `StackTraceElement.toString()` only -- 
> additional changes can follow on in subsequent PRs.
> 
> I tested out a couple alternative implementations, and have currently landed 
> on precomputing the StringBuilder capacity as seen in current state of this 
> PR (commit 
> https://github.com/openjdk/jdk/pull/9665/commits/aca442839c82688566d94cb5cb43e34b5b029642
>  ). This shaves a bit more off the `StackTraceElementBench.toString` 
> microbenchmark compared to not precomputing the StringBuilder capacity. The 
> trade off is more readability and more complex code as there are 2 passes -- 
> one to precompute length and one to build the resulting String.
> 
> Benchmark                               Mode  Cnt       Score     Error  Units
> StackTraceElementBench.printStackTrace  avgt   15  143218.862 ± 840.141  ns/op
> StackTraceElementBench.toString         avgt   15      66.566 ±   0.288  ns/op
> 
> 
> Alternately, I computed the length and collected into a `char[]` then 
> converted to String as seen in commit 
> https://github.com/openjdk/jdk/commit/de0a337e7f18f9a1525ec222ca22ced93166bf2e
>  . This ends up similar to the presized StringBuilder, with even more complex 
> code, so doesn't seem worth going that route. 
> 
> Benchmark                               Mode  Cnt       Score      Error  
> Units
> StackTraceElementBench.printStackTrace  avgt   15  133324.365 ± 1133.849  
> ns/op
> StackTraceElementBench.toString         avgt   15      68.701 ±    1.574  
> ns/op
> 
> 
> I did not write up an implementation to buffer & encode to a `byte[]` and 
> create a resulting string from that via the String constructors or 
> `newStringUTF8NoRepl`. I'm not sure that paying the complexity of UTF-16 
> handling directly would be worth improvement removing the `char[]` -> 
> `byte[]` conversion & copy, especially in most common case of Latin 1 
> `StackTraceElement` contents.

@schlosna I've filed https://bugs.openjdk.org/browse/JDK-8291641 for this. 
Please use id `8291641` and rename the ticket to `8291641: Optimize 
StackTraceElement.toString()`

-------------

PR: https://git.openjdk.org/jdk/pull/9665

Reply via email to