[NEW BUG] Small optimization in URLStreamHandler.parseURL

Claes Redestad claes.redestad at oracle.com
Sun Apr 5 17:48:52 UTC 2020


Hi Christoph,

looks good and trivial. I'll sponsor.

/Claes

On 2020-04-05 10:57, Christoph Dreis wrote:
> Hi,
> 
> I just noticed a small optimization opportunity in URLStreamHandler.parseURL for inputs like the following:
> 
> 	new URL(new URL("file:"), "file:./path/to/some/local.properties");
> 
> In those cases there is no authority involved, which makes it possible to rewrite URLStreamHandler:L269-270:
>       
>      String separator = (authority != null) ? "/" : "";
>      path = separator + spec.substring(start, limit);
> 
> into the following to avoid unnecessary string concatenations with an empty string:
> 
>       path = spec.substring(start, limit);
>       path = (authority != null) ? "/" + path : path;
> 
> I've written a small benchmark with two URLStreamHandler variants (one with the old parseURL and one with the new):
> 
> @BenchmarkMode(Mode.AverageTime)
> @OutputTimeUnit(TimeUnit.NANOSECONDS)
> public class MyBenchmark {
> 
>      @State(Scope.Benchmark)
>      public static class ThreadState {
> 
>          private URL context;
>          private URLStreamHandler newHandler = new NewURLStreamHandler();
>          private URLStreamHandler oldHandler = new OldURLStreamHandler();
>          private String spec = "file:./path/to/some/application.properties";
> 
>          public ThreadState() {
>              try {
>                  context = new URL("file:");
>              } catch (MalformedURLException ignored) {
> 
>              }
>          }
>      }
> 
>      @Benchmark
>      public URL testNew(ThreadState threadState) throws MalformedURLException {
>          return new URL(threadState.context, threadState.spec, threadState.newHandler);
>      }
> 
>      @Benchmark
>      public URL testOld(ThreadState threadState) throws MalformedURLException {
>          return new URL(threadState.context, threadState.spec, threadState.oldHandler);
>      }
> 
> }
> 
> The benchmark above yields the following results on my local machine:
> 
> Benchmark                                             Mode  Cnt     Score    Error   Units
> MyBenchmark.testNew                                   avgt   10   112,655 ±  3,494   ns/op
> MyBenchmark.testNew:·gc.alloc.rate                    avgt   10  1299,558 ± 41,238  MB/sec
> MyBenchmark.testNew:·gc.alloc.rate.norm               avgt   10   192,015 ±  0,003    B/op
> MyBenchmark.testNew:·gc.count                         avgt   10    98,000           counts
> MyBenchmark.testNew:·gc.time                          avgt   10   105,000               ms
> MyBenchmark.testOld                                   avgt   10   128,592 ±  1,183   ns/op
> MyBenchmark.testOld:·gc.alloc.rate                    avgt   10  1612,743 ± 15,792  MB/sec
> MyBenchmark.testOld:·gc.alloc.rate.norm               avgt   10   272,019 ±  0,001    B/op
> MyBenchmark.testOld:·gc.count                         avgt   10   110,000           counts
> MyBenchmark.testOld:·gc.time                          avgt   10   121,000               ms
> 
> 
> In case you think this is worthwhile I would need someone to sponsor the attached patch for me.
> I would highly appreciate that.
> 
> Cheers,
> Christoph
> 
> 
> ===== PATCH =====
> diff --git a/src/java.base/share/classes/java/net/URLStreamHandler.java b/src/java.base/share/classes/java/net/URLStreamHandler.java
> --- a/src/java.base/share/classes/java/net/URLStreamHandler.java
> +++ b/src/java.base/share/classes/java/net/URLStreamHandler.java
> @@ -266,8 +266,8 @@
>                            spec.substring(start, limit);
> 
>               } else {
> -                String separator = (authority != null) ? "/" : "";
> -                path = separator + spec.substring(start, limit);
> +                path = spec.substring(start, limit);
> +                path = (authority != null) ? "/" + path : path;
>               }
>           } else if (queryOnly && path != null) {
>               int ind = path.lastIndexOf('/');
> 
> 


More information about the core-libs-dev mailing list