On Thu, 12 Mar 2026 14:33:48 GMT, Eirik Bjørsnøs <[email protected]> wrote:

>> This PR optimizes string concatenation in `URL::toExternalForm`. This method 
>>  is called by `URL:toString` and executes often enough to be noticed during 
>> startup / classloading profiling. It was previously optimized in JDK 10 via 
>> JDK-8193034, but we can do more.
>> 
>> Key observations:
>> 
>> * The current method concatenates concatenated strings. We can get away with 
>> less by flattening and concatenating once per call.
>> * JIT StringBuilder concat optimizations prefer consecutive append calls 
>> withot interleaving  code / conditionals 
>> * The current method does not take advantage of the fact that most URL 
>> components are optional and several are commonly not present. We can 
>> specialize for those cheaper common concatenations.
>> 
>> This PR reduces runtime with 60% or more, depending on present URL 
>> components. (Benchmark results in first comment). I also ran the benchmark 
>> with compilation excluded and found no regressions for the interpreter case.
>> 
>> Working on this PR revealed that current tests miss coverage for the case 
>> where a query or ref component is the empty string. Some new test cases are 
>> added to `Constructor.java`. Otherwise, `URL::toString` seems well tested by 
>> current tests.
>> 
>> Performance refactoring, `noreg-perf`.
>
> Eirik Bjørsnøs has updated the pull request incrementally with one additional 
> commit since the last revision:
> 
>   Add cases for URLs with empty host components in the form 'protocol:///path'

src/java.base/share/classes/java/net/URLStreamHandler.java line 490:

> 488: 
> 489:         // Optionality, subtly different for authority
> 490:         var emptyAuth = u.getAuthority() == null || 
> u.getAuthority().isEmpty();

Style-wise I think better to use boolean rathe rather var here as you have to 
look closely to see that the RHS yields a boolean result (it's not obvious from 
the name "emptyAuth").

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

PR Review Comment: https://git.openjdk.org/jdk/pull/30151#discussion_r2925216626

Reply via email to