Reduce allocation in sun.net.www.protocol.jar.Handler.parseURL
Eirik Bjørsnøs
eirbjo at gmail.com
Wed Jan 20 01:52:46 UTC 2021
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