> 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 with a new target base due to a 
merge or a rebase. The pull request now contains 21 commits:

 - Merge branch 'openjdk:master' into feature/selector-performance-improvement
 - Merge remote-tracking branch 'upstream/master' into 
feature/selector-performance-improvement
 - Added 100% coverage test for FixedCapacitySet
 - Move getStyleClassNames to location it was introduced to reduce diff
 - Remove deprecations
 - Add @Deprecated tag
 - Remove commented code in BitSetTest
 - Remove unnecessary addAll overrides
 - Optimize performance of OpenAddressed Set just in case it is ever used
 - Fix docs
 - ... and 11 more: https://git.openjdk.org/jfx/compare/31fe622c...d72aefab

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

Changes: https://git.openjdk.org/jfx/pull/1316/files
  Webrev: https://webrevs.openjdk.org/?repo=jfx&pr=1316&range=11
  Stats: 1087 lines in 8 files changed: 843 ins; 201 del; 43 mod
  Patch: https://git.openjdk.org/jfx/pull/1316.diff
  Fetch: git fetch https://git.openjdk.org/jfx.git pull/1316/head:pull/1316

PR: https://git.openjdk.org/jfx/pull/1316

Reply via email to