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