On Sat, 9 Mar 2024 13:46:08 GMT, John Hendrikx <[email protected]> wrote:
>> Improves performance of selector matching in the CSS subsystem. This is done
>> by using custom set implementation which are highly optimized for the most
>> common cases where the number of selectors is small (most commonly 1 or 2).
>> It also should be more memory efficient for medium sized and large
>> applications which have many style names defined in various CSS files.
>>
>> Due to the optimization, the concept of `StyleClass`, which was only
>> introduced to assign a fixed bit index for each unique style class name
>> encountered, is no longer needed. This is because style classes are no
>> longer stored in a `BitSet` which required a fixed index per encountered
>> style class.
>>
>> The performance improvements are the result of several factors:
>> - Less memory use when only very few style class names are used in selectors
>> and styles from a large pool of potential styles (a `BitSet` for potentially
>> 1000 different style names needed 1000 bits (worst case) as it was not
>> sparse).
>> - Specialized sets for small number of elements (0, 1, 2, 3-9 and 10+)
>> - Specialized sets are append only (reduces code paths) and can be made read
>> only without requiring a wrapper
>> - Iterator creation is avoided when doing `containsAll` check thanks to the
>> inverse function `isSuperSetOf`
>> - Avoids making a copy of the list of style class names to compare (to
>> convert them to `StyleClass` and put them into a `Set`) -- this copy could
>> not be cached and was always discarded immediately after...
>>
>> The overall performance was tested using the JFXCentral application which
>> displays about 800 nodes on its start page with about 1000 styles in various
>> style sheets (and which allows to refresh this page easily).
>>
>> On JavaFX 20, the fastest refresh speed was 121 ms on my machine. With the
>> improvements in this PR, the fastest refresh had become 89 ms. The speed
>> improvement is the result of a 30% faster `Scene#doCSSPass`, which takes up
>> the bulk of the time to refresh the JFXCentral main page (about 100 ms
>> before vs 70 ms after the change).
>
> John Hendrikx has updated the pull request incrementally with one additional
> commit since the last revision:
>
> Add @Deprecated tag
modules/javafx.graphics/src/main/java/javafx/css/SimpleSelector.java line 82:
> 80: * @deprecated use {@link #getStyleClassNames()} instead
> 81: */
> 82: @Deprecated(forRemoval = true)
Given that the class itself is deprecated for removal, marking this method as
deprecated is unnecessary.
modules/javafx.graphics/src/main/java/javafx/css/SimpleSelector.java line 93:
> 91: */
> 92: @Deprecated(forRemoval = true)
> 93: public Set<StyleClass> getStyleClassSet() {
Given that the class itself is deprecated for removal, marking this method as
deprecated is unnecessary.
-------------
PR Review Comment: https://git.openjdk.org/jfx/pull/1316#discussion_r1520042680
PR Review Comment: https://git.openjdk.org/jfx/pull/1316#discussion_r1520037406