Integrated: JDK-8199216: Quadratic layout time with nested nodes and pseudo-class in style sheet
John Hendrikx
jhendrikx at openjdk.org
Fri Sep 15 14:01:11 UTC 2023
On Thu, 30 Mar 2023 12:49:39 GMT, John Hendrikx <jhendrikx at openjdk.org> wrote:
> This fix introduces immutable sets of `PseudoClass` almost everywhere, as they are rarely modified. These are re-used by caching them in a new class `ImmutablePseudoClassSetsCache`.
>
> In order to make this work, `BitSet` had to be cleaned up. It made assumptions about the collections it is given (which may no longer always be another `BitSet`). I also added the appropriate null checks to ensure there weren't any other bugs lurking.
>
> Then there was a severe bug in `toArray` in both the subclasses that implement `BitSet`.
>
> The bug in `toArray` was incorrect use of the variable `index` which was used for both advancing the pointer in the array to be generated, as well as for the index to the correct `long` in the `BitSet`. This must have resulted in other hard to reproduce problems when dealing with `Set<PseudoClass>` or `Set<StyleClass>` if directly or indirectly calling `toArray` (which is for example used by `List.of` and `Set.of`) -- I fixed this bug because I need to call `Set.copyOf` which uses `toArray` -- as the same bug was also present in `StyleClassSet`, I fixed it there as well.
>
> The net result of this change is that there are far fewer `PseudoClassState` objects created; the majority of these are never modified, and the few that are left are where you'd expect to see them modified.
>
> A test with 160 nested HBoxes which were given the hover state shows a 99.99% reduction in `PseudoClassState` instances and a 70% reduction in heap use (220 MB -> 68 MB), see the linked ticket for more details.
>
> Although the test case above was extreme, this change should have positive effects for most applications.
This pull request has now been integrated.
Changeset: 5e145cc0
Author: John Hendrikx <jhendrikx at openjdk.org>
URL: https://git.openjdk.org/jfx/commit/5e145cc06ef68c50a4ffc95574fdafd44e054100
Stats: 326 lines in 10 files changed: 195 ins; 90 del; 41 mod
8199216: Quadratic layout time with nested nodes and pseudo-class in style sheet
Reviewed-by: angorya, jvos, mstrauss, kcr, mhanl
-------------
PR: https://git.openjdk.org/jfx/pull/1076
More information about the openjfx-dev
mailing list