On Mon, 14 Oct 2024 18:17:15 GMT, Chen Liang <[email protected]> wrote:
>> Eirik Bjørsnøs has updated the pull request incrementally with one
>> additional commit since the last revision:
>>
>> Use Arrays.sort instead of TreeSet
>
> src/java.base/share/classes/java/util/zip/ZipFile.java line 1831:
>
>> 1829: metaVersions = new HashMap<>();
>> 1830: for (var entry : metaVersionsMap.entrySet()) {
>> 1831: // Convert TreeSet<Integer> to int[] for
>> performance
>
> I think if you just require order upon final freezing, you can just use a
> HashSet or ArrayList, and perform the sorting and deduplication when you
> compile to an int array.
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?
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/21489#discussion_r1800001845