Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8353013

java.net.URI.create(String) may have low performance to scan the host/domain name from URI string when the hostname starts with number

XMLWordPrintable

    • b19

        In AWS, we have customer reporting the NumberFormatException threw and caught by java.net.URI.create in some specific cases, see the details here https://github.com/aws/aws-sdk-java-v2/issues/5933

        In fact in AWS, it is very common to see account id in the URI like: "https://98765432101.ddb.us-east-1.amazonaws.com", URI#Parser always try to scan ipv4 address first when it parse the server from the string(https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/java/net/URI.java#L3354-L3396), when it scan ipv4 address the account id will cause NumberFormatException threw from Integer.parseInt called by URI#Parser#scanByte (https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/java/net/URI.java#L3423-L3431).

        In JMH benchmark, the NumberFormatException cloud lead to ~4x worse performance, but overall it should be easy and worth to fix in URI parser.

        JMH benchmark our team run to verify the performance:

        ```
            @Benchmark
            public void uriCreateAccountIdEndpoint(Blackhole blackhole) {
                blackhole.consume(URI.create("https://98765432101.ddb.us-east-1.amazonaws.com"));
            }

            @Benchmark
            public void uriCreateStandardEndpoint(Blackhole blackhole) {
                blackhole.consume(URI.create("https://dynamodb.us-east-1.amazonaws.com"));
            }
        ```
        Result:
        ```
        Benchmark Mode Cnt Score Error Units
        uriCreateAccountIdEndpoint thrpt 10 0.311 ± 0.008 ops/us
        uriCreateStandardEndpoint thrpt 10 1.222 ± 0.004 ops/us
        uriCreateAccountIdEndpoint avgt 10 3.218 ± 0.115 us/op
        uriCreateStandardEndpoint avgt 10 0.830 ± 0.001 us/op

        ```

              xpeng Xiaolong Peng
              xpeng Xiaolong Peng
              Votes:
              0 Vote for this issue
              Watchers:
              6 Start watching this issue

                Created:
                Updated:
                Resolved: