On Fri, 22 Sep 2023 08:53:07 GMT, Claes Redestad <[email protected]> wrote:

>> `URLEncoder` currently appends chars that needs encoding into a 
>> `java.io.CharArrayWriter`, converts that to a `String`, uses 
>> `String::getBytes` to get the encoded bytes and then appends these bytes in 
>> a escaped manner to the output stream. This is somewhat inefficient.
>> 
>> This PR replaces the `CharArrayWriter` with a reusable `CharBuffer` + 
>> `ByteBuffer` pair. This allows us to encode to the output `StringBuilder` in 
>> small chunks, with greatly reduced allocation as a result.
>> 
>> The exact size of the buffers is an open question, but generally it seems 
>> that a tiny buffer wins by virtue of allocating less, and that the per chunk 
>> overheads are relatively small.
>
> Claes Redestad has updated the pull request incrementally with one additional 
> commit since the last revision:
> 
>   Update src/java.base/share/classes/java/net/URLEncoder.java
>   
>   Co-authored-by: ExE Boss <[email protected]>

> > Micros show a small throughput win and a large allocation reduction for 
> > variants that need to change the URL either partially or completely, and no 
> > regression when the URL remains unchanged:
> > ```
> > Name                             (unchanged) Cnt        Base    Error       
> >   Test    Error   Unit   Diff%
> > URLEncodeDecode.testEncodeLatin1           0  15       3.471 ±  0.103       
> >  2.796 ±  0.078  ms/op   19.5% (p = 0.000*)
> >   :gc.alloc.rate                                     828.462 ± 25.054      
> > 673.090 ± 19.214 MB/sec  -18.8% (p = 0.000*)
> >   :gc.alloc.rate.norm                            3013680.062 ±  0.721  
> > 1972347.384 ±  0.540   B/op  -34.6% (p = 0.000*)
> >   :gc.count                                           20.000                
> > 17.000          counts
> >   :gc.time                                            16.000                
> > 15.000              ms
> > <snip>
> > ```
> 
> Can you share how to generate this kind of diff report? What I am doing now 
> is to run the baseline and the current version separately, and then use the 
> processing program I wrote to generate the diff report. Can you share your 
> experience?

It's a small utility I've toyed with and iterated on over the last couple of 
weeks. It's tangled up on some legacy proprietary code, but I think I can 
refactor out the relevant pieces and put it in my OpenJDK repo in the next 
couple of weeks.

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

PR Comment: https://git.openjdk.org/jdk/pull/15865#issuecomment-1732677299

Reply via email to