On Wed, 15 Dec 2021 20:09:22 GMT, Roger Riggs <rri...@openjdk.org> wrote:

>> A few refactorings to how `java.util.Formatter` sets up `FormatString`s, 
>> aligning the implementation with changes explored by the TemplatedStrings 
>> JEP and ever so slightly improving performance:
>> 
>> - turn `Flags` into an `int` (fewer allocations in the complex case)
>> - remove some superfluous varargs: `checkBadFlags(Flags.PARENTHESES, ...` -> 
>> `checkBadFlags(Flags.Parentheses | ...` - again less allocations in the 
>> complex cases since these varargs arrays were being allocated. Also improves 
>> error messages since all bad flags will be listed in the exception message.
>> - make `FormatSpecifier` and `FixedString` static, reducing size of these 
>> objects slightly.
>> 
>> Baseline: 
>> 
>> Benchmark                                                           Mode  
>> Cnt     Score     Error   Units
>> StringFormat.complexFormat                                          avgt   
>> 25  8977.043 ± 246.810   ns/op
>> StringFormat.complexFormat:·gc.alloc.rate.norm                      avgt   
>> 25  2144.170 ±   0.012    B/op
>> StringFormat.stringFormat                                           avgt   
>> 25   252.109 ±   2.732   ns/op
>> StringFormat.stringFormat:·gc.alloc.rate.norm                       avgt   
>> 25   256.019 ±   0.001    B/op
>> StringFormat.stringIntFormat                                        avgt   
>> 25   576.423 ±   4.596   ns/op
>> StringFormat.stringIntFormat:·gc.alloc.rate.norm                    avgt   
>> 25   432.034 ±   0.002    B/op
>> StringFormat.widthStringFormat                                      avgt   
>> 25   999.835 ±  20.127   ns/op
>> StringFormat.widthStringFormat:·gc.alloc.rate.norm                  avgt   
>> 25   525.509 ±  14.742    B/op
>> StringFormat.widthStringIntFormat                                   avgt   
>> 25  1332.163 ±  30.901   ns/op
>> StringFormat.widthStringIntFormat:·gc.alloc.rate.norm               avgt   
>> 25   720.715 ±   8.798    B/op
>> 
>> 
>> Patch:
>> 
>> Benchmark                                                           Mode  
>> Cnt     Score    Error   Units
>> StringFormat.complexFormat                                          avgt   
>> 25  8840.089 ± 51.222   ns/op
>> StringFormat.complexFormat:·gc.alloc.rate.norm                      avgt   
>> 25  1736.151 ±  0.009    B/op
>> StringFormat.stringFormat                                           avgt   
>> 25   247.310 ±  2.091   ns/op
>> StringFormat.stringFormat:·gc.alloc.rate.norm                       avgt   
>> 25   248.018 ±  0.001    B/op
>> StringFormat.stringIntFormat                                        avgt   
>> 25   565.487 ±  6.572   ns/op
>> StringFormat.stringIntFormat:·gc.alloc.rate.norm                    avgt   
>> 25   408.032 ±  0.002    B
>> StringFormat.widthStringFormat                                      avgt   
>> 25   970.015 ± 32.915   ns/op
>> StringFormat.widthStringFormat:·gc.alloc.rate.norm                  avgt   
>> 25   449.991 ± 25.716    B/op
>> StringFormat.widthStringIntFormat                                   avgt   
>> 25  1284.572 ± 28.829   ns/op
>> StringFormat.widthStringIntFormat:·gc.alloc.rate.norm               avgt   
>> 25   636.872 ±  7.331    B/op
>
> Looks good to me.  Not a big improvement, but as much as it gets used.  👍

Thanks for reviews, @RogerRiggs and @naotoj ! 

Yes, the speed-up is a bit underwhelming. I had to dial back some more 
promising optimizations I was exploring (#6792) after realizing they'd be 
breaking semantics in case of an illegal format string. These are the cleanups 
and pile-on optimizations I could salvage from that experiment, along with some 
harmonization with changes @JimLaskey is doing for TemplatedStrings.

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

PR: https://git.openjdk.java.net/jdk/pull/6821

Reply via email to