`scanByte` throws `NumberFormatException` for URIs that start with numbers, 
e.g., https://11111111.x.y/
The current flow is `parseIPv4Address` → `scanIPv4Address` → `scanByte`. 
`parseIPv4Address` uses `NumberFormatException` for control flow, so it 
captures the exception, ignores it, and returns -1. This has been reported by 
AWS customer to cause low performance. Details: 
[JDK-8353013](https://bugs.openjdk.org/browse/JDK-8353013) & 
https://github.com/aws/aws-sdk-java-v2/issues/5933

This PR avoids NumberFormatException by skipping calls to `Integer.parseInt` if 
the number of digits in the octet is > 3.

I benchmarked on local machine for potential regressions.
https://gist.github.com/rk-kmr/cb1a3d59225c17b180a29cc125ebf887


Benchmark                                     Mode     Cnt        Score       
Error   Units
URIBenchMark.newImplWithNormalUrl            thrpt      10        0.004 ±     
0.001  ops/ns
URIBenchMark.newImplWithNumberlUrl           thrpt      10        0.004 ±     
0.001  ops/ns
URIBenchMark.oldImplWithNormalUrl            thrpt      10        0.004 ±     
0.001  ops/ns
URIBenchMark.oldImplWithNumUrl               thrpt      10        0.001 ±     
0.001  ops/ns
URIBenchMark.newImplWithNormalUrl             avgt      10      236.762 ±     
8.700   ns/op
URIBenchMark.newImplWithNumberlUrl            avgt      10      264.017 ±     
7.274   ns/op
URIBenchMark.oldImplWithNormalUrl             avgt      10      233.853 ±     
6.539   ns/op
URIBenchMark.oldImplWithNumUrl                avgt      10     1183.572 ±    
29.242   ns/op


I ran following tests.

make test-tier1
make test-tier2
make test TEST=jdk/java/net

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

Commit messages:
 - Update src/java.base/share/classes/java/net/URI.java
 - make test pass
 - add unit test
 - Address PR comments
 - Merge branch 'openjdk:master' into JDK-8353013
 - reuse scan method instead
 - avoid parseInt if scanned digit count > 3

Changes: https://git.openjdk.org/jdk/pull/24295/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=24295&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8353013
  Stats: 40 lines in 2 files changed: 37 ins; 0 del; 3 mod
  Patch: https://git.openjdk.org/jdk/pull/24295.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/24295/head:pull/24295

PR: https://git.openjdk.org/jdk/pull/24295

Reply via email to