[PATCH] Use StringJoiner where appropriate in java.base

Peter Levart peter.levart at gmail.com
Thu Jun 20 20:31:42 UTC 2019


On 6/20/19 2:39 PM, Kasper Nielsen wrote:
>> If you allowed a two-time pass of the primitive array you could
>> actually create a version that only allocated the actual String and
>> backing array.
> I tried implementing it
> https://gist.github.com/kaspernielsen/62e4eedffdb395228777925551a45e7f
> And got a 30-40 % performance increase.

This is nice and garbage-free.

This method is not very performance critical I think (unless someone is 
using it to format int[] into JSON for example), so I don't know whether 
optimizing it is that important. OTOH the optimized code is not that 
difficult to understand, so why not? I would also add overflow checks 
when computing the length of resulting byte[]. First I would pre-check 
the length of passed in int[] array (it must be less than 
Integer.MAX_VALUE / 3), then checking for negative size after each 
addition of element length, throwing OOME if overflow happens. Then I 
would re-check if the performance is still favorable and see if the 
resulting method is not too complicated to understand after all.

Regards, Peter


>
> ToString2.toStringExisting        1  avgt    5     16.855 ±    0.960  ns/op
> ToString2.toStringExisting       10  avgt    5     79.247 ±    3.142  ns/op
> ToString2.toStringExisting      100  avgt    5    814.197 ±   46.062  ns/op
> ToString2.toStringExisting     1000  avgt    5  15288.172 ± 1649.338  ns/op
>
> ToString2.toString2Pass       1  avgt    5     13.671 ±    0.142  ns/op
> ToString2.toString2Pass      10  avgt    5     54.090 ±    0.724  ns/op
> ToString2.toString2Pass     100  avgt    5    513.508 ±    6.063  ns/op
> ToString2.toString2Pass    1000  avgt    5   9189.950 ±   47.059  ns/op
>
> ToString2.toStringExisting:·gc.alloc.rate.norm                 1  avgt
>     5     80.000 ±    0.001    B/op
> ToString2.toStringExisting:·gc.alloc.rate.norm                10  avgt
>     5    160.000 ±    0.001    B/op
> ToString2.toStringExisting:·gc.alloc.rate.norm               100  avgt
>     5   1664.000 ±    0.001    B/op
> ToString2.toStringExisting:·gc.alloc.rate.norm              1000  avgt
>     5  23536.006 ±    0.001    B/op
>
> ToString2.toString2Pass:·gc.alloc.rate.norm                1  avgt
> 5     48.000 ±    0.001    B/op
> ToString2.toString2Pass:·gc.alloc.rate.norm               10  avgt
> 5    120.000 ±    0.001    B/op
> ToString2.toString2Pass:·gc.alloc.rate.norm              100  avgt
> 5    840.000 ±    0.001    B/op
> ToString2.toString2Pass:·gc.alloc.rate.norm             1000  avgt
> 5   9848.004 ±    0.001    B/op
>
> Don't know if it is something worth adding?
>
> /Kasper



More information about the core-libs-dev mailing list