On Mon, 14 Oct 2024 18:17:15 GMT, Chen Liang <li...@openjdk.org> 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

Reply via email to