Possible approaches to JDK-8185886: Improve scrolling performance of TableView and TreeTableView

Jeanette Winzenburg fastegal at swingempire.de
Wed Sep 2 12:24:19 UTC 2020

Hi John,

thanks for the clarification :)

Hmm .. but then it's not really a PR against JDK-8185886 (scrolling  
performance was always bad with many columns) but against - yet to be  
reported - side-effect of JDK-8090322 which happens to detoriate  
tableView performance even further (there might be other side-effects)?

-- Jeanette

Zitat von John Hendrikx <hjohn at xs4all.nl>:

> The "dynamic update performance" performance issue we are seeing is  
> a regression from JDK-8090322.  In this change the Node treeShowing  
> property was introduced.  The JDK-8090322 warns in its description  
> about:
> """    Considerations:
> * This is too expensive to calculate for all nodes by default. So  
> the simplest way to provide it would be a special binding  
> implementation or a util class. Where you create a instance and pass  
> in the node you are interested in. It can then register listeners  
> all the way up the tree and listen to what it needs.  """
> The above comment is warning against the fact that registering  
> listeners for EACH Node on Window and Scene is going to be a  
> performance issue. As nodes can number in the 1000's or 10.000's,  
> that's a lot of listeners to store in a List data structure.
> PR 185 targets this issue and implements the feature in JDK-8090322 in
> the way that was suggested in the above comment, instead of how it  
> currently is implemented (registering listeners for every Node, just  
> in case someone needs the treeShowing property).
> It's scope is not as broad as it would seem (because of a change in  
> Node).  It effectively only makes a small change in two controls  
> (PopupWindow and ProgressIndicatorSkin).
> --John
> On 31/08/2020 16:54, Jeanette Winzenburg wrote:
>> Looking at the examples provided in 108/125: apart from both having many
>> columns (> 300 makes them really nasty) they differ in
>> Table content:
>> 125 - static data
>> 108 - items are frequently modified (added)
>> Perceived performance:
>> 125 - vertical scrolling: thumb/content lags behind mouse
>> 108 - with enough columns, all interaction is sluggish (mouse, keys,
>> ..), scrolling being just one of them
>> Both have examples, running those against the suggested fixes (with 108a
>> for Jose's approach)
>> 125 - fixes its own example, does nothing for the other
>> 108, 108a, 185 - improves its own example, does nothing for other
>> So we seem to have multiple issues that are (mostly) orthogonal: one
>> being the broken/missing horizontal virtualization (125), the other
>> related to dynamic update of table content (108, 108a, 185). We need to
>> solve both, the solution/s for one looks (mostly?) unrelated to the
>> solution to the other.
>> 125 is the only one PR for its use-case, and it seems to do its job.
>> From those targeting the dynamic data update all except Jose's (not yet
>> formalized into a PR) approach feel too broad: table's reaction to items
>> modifications is .. suboptimal in more than one aspect. Changing overall
>> notification implementation to improve that, sounds like covering it up.
>> -- Jeanette
>> Zitat von Kevin Rushforth <kevin.rushforth at oracle.com>:
>>> Sorry for the badly formatted html. Here it is again.
>>> I see some progress being made on the {Tree}TableView performance
>>> issue. To summarize where I think we are:
>>> There are currently 2 different approaches under review:
>>> 1. https://github.com/openjdk/jfx/pull/108 : optimization in
>>> javafx.base to make removing listeners faster
>>> 2. https://github.com/openjdk/jfx/pull/125 : optimization in TableView
>>> to reduce the number of add / removes
>>> In addition, the following is a WIP PR that the author thinks could be
>>> a 3rd approach:
>>> 3. https://github.com/openjdk/jfx/pull/185 : optimization in scene
>>> graph to avoid install treeShowing listeners on Window and Scene for
>>> all nodes
>>> Jose has proposed a 4th approach as a comment to PR #108, and as I
>>> understand it, he will propose a PR shortly.
>>> 4. Don't clear the list of children in a VirtualFlow when the number
>>> of items changes.
>>> So the first thing that is needed is to evaluate the approaches and
>>> decide which one to pursue.
>>> Options 1 and 3 are more broad in their scope, option #2 is more
>>> targeted (to TableView), but within that area is a larger change.
>>> Option #3 would remove the (internal) treeShowing property as a
>>> generally available concept and only use it for controls like
>>> ProgressIndicator that really need it. Option #4 affects only controls
>>> that use VirtualFlow (ListView, TableVIew, TreeTableView), and seems
>>> not to be a large change (presuming we can verify that no leak is
>>> introduced).
>>> I note that these fixes are not mutually exclusive, but I do think we
>>> need to settle on a primary approach and use that to fix this issue.
>>> If there are still performance problems after that fix, we can
>>> consider one (or more) of the others.
>>> Comments?
>>> -- Kevin

More information about the openjfx-dev mailing list