On Wed, 5 Jul 2023 20:52:28 GMT, Michael Strauß <mstra...@openjdk.org> wrote:

>> John Hendrikx has updated the pull request with a new target base due to a 
>> merge or a rebase. The pull request now contains 16 commits:
>> 
>>  - Merge branch 'master' of https://git.openjdk.org/jfx into
>>    feature/immutable-pseudoclassstate
>>  - Merge remote-tracking branch 'upstream/master' into 
>> feature/immutable-pseudoclassstate
>>  - Avoid using Lambda in ImmutablePseudoClassSetsCache.of()
>>  - Merge branch 'master' of https://git.openjdk.org/jfx into
>>    feature/immutable-pseudoclassstate
>>  - Fix another edge case in BitSet equals
>>    
>>    When arrays are not the same size, but there are no set bits in the ones
>>    the other set doesn't have, two bit sets can still be considered equal
>>  - Take element type into account for BitSet.equals()
>>  - Base BitSet on AbstractSet to inherit correct equals/hashCode/toArray
>>    
>>    - Removed faulty toArray implementations in PseudoClassState and
>>    StyleClassSet
>>    - Added test that verifies equals/hashCode for PseudoClassState respect
>>    Set contract now
>>    - Made getBits package private so it can't be inherited
>>  - Remove unused code
>>  - Ensure Match doesn't allow modification
>>  - Simplify ImmutablePseudoClassSetsCache and avoid an unnecessary copy
>>  - ... and 6 more: https://git.openjdk.org/jfx/compare/9ad0e908...7975ae99
>
> modules/javafx.graphics/src/main/java/com/sun/javafx/css/ImmutablePseudoClassSetsCache.java
>  line 57:
> 
>> 55:         }
>> 56: 
>> 57:         Set<PseudoClass> copy = Set.copyOf(pseudoClasses);
> 
> The set that is returned from this method will probably be passed into the 
> method over and over again. Every time, `CACHE.get(...)` will call 
> `pseudoClasses.hashCode()`, which in turn iterates over all elements to 
> compute the hash code. Have you considered precomputing the hash code of the 
> set, so that this repeated recalculation is not required? While this might 
> seem like a micro-optimization, we are potentially dealing with a method that 
> is called very often.
> 
> Here is an alternative implementation for an immutable set that precomputes 
> and stores its hash code:
> 
> final class ImmutableSet<T> extends AbstractSet<T> {
>     private final T[] elements;
>     private final int hashCode;
> 
>     @SuppressWarnings("unchecked")
>     ImmutableSet(Set<T> elements) {
>         this.elements = (T[])elements.toArray();
>         this.hashCode = elements.hashCode();
>     }
> 
>     @Override
>     public Object[] toArray() {
>         return elements.clone();
>     }
> 
>     @Override
>     public Iterator<T> iterator() {
>         return new Iterator<>() {
>             int index;
> 
>             @Override
>             public boolean hasNext() {
>                 return index < elements.length;
>             }
> 
>             @Override
>             public T next() {
>                 try {
>                     return elements[index++];
>                 } catch (ArrayIndexOutOfBoundsException ignored) {
>                     throw new NoSuchElementException();
>                 }
>             }
>         };
>     }
> 
>     @Override
>     public int size() {
>         return elements.length;
>     }
> 
>     @Override
>     public int hashCode() {
>         return hashCode;
>     }
> }

we can even consider to calculate it lazily, if we want to take this approach

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

PR Review Comment: https://git.openjdk.org/jfx/pull/1076#discussion_r1253638535

Reply via email to