Reduce allocation in sun.net.www.protocol.jar.Handler.parseURL

Claes Redestad claes.redestad at oracle.com
Wed Jan 20 11:57:28 UTC 2021


Hi,

looks reasonable. I'll file an RFE.

- canonize -> canonicalize seem like an appropriate change of terms :-)

- the bangSlash parameter could perhaps be better named from, since 
bangSlash is not a concept known to ParseUtil. Or move the util methods 
to the Handler, since it's the only caller anyway

- calling file.length() twice: maybe let len = file.length() and replace 
len == 0 with from >= len?

Thanks!

/Claes

On 2021-01-20 02:52, Eirik Bjørsnøs wrote:
> Hello,
>
> sun.net.www.protocol.jar.Handler.parseURL unconditionally calls
> String.substring twice on the spec string, even when
> ParseUtil.canonizeString later determines that no canonization was required.
>
> By letting canonizeString do the substring calls, but only when it
> determines that it is needed, we can remove some unnecessary String and
> byte[] allocations.
>
> Patch:
>
> https://github.com/eirbjo/jdk/commit/87da9032d7fb622f5d466f43faded4de672ebdda
>
> JMH micro:
>
> @Benchmark
> public void initURL(Blackhole blackhole) throws MalformedURLException {
>      blackhole.consume(new URL(new URL("jar:file:/spring-aop.jar!/"),
> "org/springframework/aop/framework/AbstractSingletonProxyFactoryBean.class"));
> }
>
> It shows a performance win for the patch in terms of throughput and bytes /
> operation:
>
> Baseline:
>
> Benchmark                                               Mode  Cnt
>   Score       Error   Units
> ZipBenchmark.initURL                                   thrpt   25
>   1673457.129 ± 22857.945   ops/s
> ZipBenchmark.initURL:·gc.alloc.rate                    thrpt   25
> 1410.227 ±    19.283  MB/sec
> ZipBenchmark.initURL:·gc.alloc.rate.norm               thrpt   25
>   928.080 ±     0.005    B/op
> ZipBenchmark.initURL:·gc.churn.G1_Eden_Space           thrpt   25
> 1412.557 ±    22.575  MB/sec
> ZipBenchmark.initURL:·gc.churn.G1_Eden_Space.norm      thrpt   25
>   929.589 ±     5.756    B/op
> ZipBenchmark.initURL:·gc.churn.G1_Survivor_Space       thrpt   25
>   0.006 ±     0.002  MB/sec
> ZipBenchmark.initURL:·gc.churn.G1_Survivor_Space.norm  thrpt   25
>   0.004 ±     0.001    B/op
> ZipBenchmark.initURL:·gc.count                         thrpt   25
> 1441.000              counts
> ZipBenchmark.initURL:·gc.time                          thrpt   25
>   961.000                  ms
>
> After:
>
> Benchmark                                               Mode  Cnt
>   Score       Error   Units
> ZipBenchmark.initURL                                   thrpt   25
>   1831971.983 ± 35705.091   ops/s
> ZipBenchmark.initURL:·gc.alloc.rate                    thrpt   25
> 1011.389 ±    19.689  MB/sec
> ZipBenchmark.initURL:·gc.alloc.rate.norm               thrpt   25
>   608.061 ±     0.001    B/op
> ZipBenchmark.initURL:·gc.churn.G1_Eden_Space           thrpt   25
> 1011.746 ±    20.583  MB/sec
> ZipBenchmark.initURL:·gc.churn.G1_Eden_Space.norm      thrpt   25
>   608.275 ±     3.609    B/op
> ZipBenchmark.initURL:·gc.churn.G1_Survivor_Space       thrpt   25
>   0.007 ±     0.001  MB/sec
> ZipBenchmark.initURL:·gc.churn.G1_Survivor_Space.norm  thrpt   25
>   0.004 ±     0.001    B/op
> ZipBenchmark.initURL:·gc.count                         thrpt   25
> 1197.000              counts
> ZipBenchmark.initURL:·gc.time                          thrpt   25
>   760.000                  ms
>
> Thanks,
> Eirik.


More information about the core-libs-dev mailing list