> Instead of allocating a copy of underlying array via 
> `CharArrayWriter.toCharArray()` and passing it to constructor of String
> String str = new String(charArrayWriter.toCharArray());
> we could call `toString()` method
> String str = charArrayWriter.toString();
> decoding existing char[] without making a copy. This slightly speeds up the 
> method reducing at the same time memory consumption for decoding URLs with 
> non-latin symbols:
> @State(Scope.Thread)
> @BenchmarkMode(Mode.AverageTime)
> @OutputTimeUnit(TimeUnit.NANOSECONDS)
> @Fork(jvmArgsAppend = {"-Xms2g", "-Xmx2g"})
> public class UrlEncoderBenchmark {
>   private static final Charset charset = Charset.defaultCharset();
>   private static final String utf8Url = 
> "https://ru.wikipedia.org/wiki/Организация_Объединённых_Наций";; // UN
> 
>   @Benchmark
>   public String encodeUtf8() {
>     return URLEncoder.encode(utf8Url, charset);
>   }
> }
> The benchmark on my maching give the following output:
> before
> Benchmark                                                        Mode  Cnt    
>  Score    Error   Units
> UrlEncoderBenchmark.encodeUtf8                                   avgt  100  
> 1166.378 ±  8.411   ns/op
> UrlEncoderBenchmark.encodeUtf8:·gc.alloc.rate                    avgt  100   
> 932.944 ±  6.393  MB/sec
> UrlEncoderBenchmark.encodeUtf8:·gc.alloc.rate.norm               avgt  100  
> 1712.193 ±  0.005    B/op
> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Eden_Space           avgt  100   
> 929.221 ± 24.268  MB/sec
> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Eden_Space.norm      avgt  100  
> 1705.444 ± 43.235    B/op
> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Survivor_Space       avgt  100    
>  0.006 ±  0.001  MB/sec
> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Survivor_Space.norm  avgt  100    
>  0.011 ±  0.002    B/op
> UrlEncoderBenchmark.encodeUtf8:·gc.count                         avgt  100   
> 652.000           counts
> UrlEncoderBenchmark.encodeUtf8:·gc.time                          avgt  100   
> 334.000               ms
> 
> after
> Benchmark                                                        Mode  Cnt    
>  Score    Error   Units
> UrlEncoderBenchmark.encodeUtf8                                   avgt  100  
> 1058.851 ±  6.006   ns/op
> UrlEncoderBenchmark.encodeUtf8:·gc.alloc.rate                    avgt  100   
> 931.489 ±  5.182  MB/sec
> UrlEncoderBenchmark.encodeUtf8:·gc.alloc.rate.norm               avgt  100  
> 1552.176 ±  0.005    B/op
> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Eden_Space           avgt  100   
> 933.491 ± 24.164  MB/sec
> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Eden_Space.norm      avgt  100  
> 1555.488 ± 39.204    B/op
> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Survivor_Space       avgt  100    
>  0.006 ±  0.001  MB/sec
> UrlEncoderBenchmark.encodeUtf8:·gc.churn.G1_Survivor_Space.norm  avgt  100    
>  0.010 ±  0.002    B/op
> UrlEncoderBenchmark.encodeUtf8:·gc.count                         avgt  100   
> 655.000           counts
> UrlEncoderBenchmark.encodeUtf8:·gc.time                          avgt  100   
> 333.000               ms

Сергей Цыпанов has updated the pull request with a new target base due to a 
merge or a rebase. The incremental webrev excludes the unrelated changes 
brought in by the merge/rebase. The pull request contains five additional 
commits since the last revision:

 - Merge branch 'master' into enc
 - 8259699: Reduce char[] copying in URLEncoder.encode(String, Charset) - small 
JavaDoc fix
 - Merge branch 'master' into enc
 - Merge branch 'master' into enc
 - Improve URLEncoder.encode(String, Charset)

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

Changes:
  - all: https://git.openjdk.java.net/jdk/pull/1598/files
  - new: https://git.openjdk.java.net/jdk/pull/1598/files/ae293c8b..2183af4c

Webrevs:
 - full: https://webrevs.openjdk.java.net/?repo=jdk&pr=1598&range=02
 - incr: https://webrevs.openjdk.java.net/?repo=jdk&pr=1598&range=01-02

  Stats: 3325 lines in 139 files changed: 1985 ins; 870 del; 470 mod
  Patch: https://git.openjdk.java.net/jdk/pull/1598.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/1598/head:pull/1598

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

Reply via email to