RFR: 8342040: Further improve entry lookup performance for multi-release JARs [v2]

Chen Liang liach at openjdk.org
Tue Oct 15 05:16:17 UTC 2024


On Mon, 14 Oct 2024 20:57:45 GMT, Claes Redestad <redestad at openjdk.org> wrote:

>> If we trust that versioned entries are rare, this should not matter much either way. But I pushed a commit which uses HashSet and Arrays::sort on freezing instead. WDYT?
>> 
>> Given that most versioned entries will only have a single version, we may save some memory and speed by special-casing for sets with one or two versions:
>> 
>> 
>> switch (metaVersionsMap.get(name)) {
>>     case null -> {
>>         // Special-case for set of size 1
>>         metaVersionsMap.put(name, Set.of(version));
>>     }
>>     case Set<Integer> versions when versions.size() == 1 -> {
>>         // Special-case for set of size 2
>>         metaVersionsMap.put(name, Set.of(version, versions.iterator().next()));
>>     }
>>     case Set<Integer> versions when versions.size() == 2 -> {
>>         // Now we convert to HashSet
>>         HashSet<Integer> set = new HashSet<>(versions);
>>         set.add(version);
>>         metaVersionsMap.put(name, set);
>>     }
>>     case HashSet<Integer> versions -> {
>>         // Just add
>>         versions.add(version);
>>     }
>>     default -> throw new AssertionError("Illegal state");
>> }
>> 
>> 
>> 
>> But again, versioned entries are rare, so perhaps better to keep it simple. Does @cl4es have thoughts about this?
>
> I like simple. 
> 
> Mixing Set.of and HashSet means a lot of semantic fu-fu (throwing/not throwing on nulls) and risks being suboptimal due making some call sites megamorphic.

Yep, looks good. And I agree with Claes' evaluation that we should not complicate this construction further, especially that the result is quickly garbage collected when we compile into the string to int array map.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/21489#discussion_r1800467908


More information about the security-dev mailing list