On Wed, 15 Apr 2020 07:11:27 GMT, dannygonzalez 
<github.com+6702882+dannygonza...@openjdk.org> wrote:

>> @dannygonzalez You mentioned "There are multiple change listeners on a Node 
>> for example, so you can imagine with the number of nodes in a TableView this 
>> is going to be a problem if the unregistering is slow.".
>> 
>> Your changes in this PR seem to be focused on improving performance of 
>> unregistering listeners when there are thousands of listeners listening on 
>> changes or invalidations of the **same** property.  Is this actually the 
>> case?  Is there a single property in TableView or TreeTableView where such a 
>> high amount of listeners are present?  If so, I think the problem should be 
>> solved there.
>> 
>> As it is, I donot think this PR will help unregistration performance of 
>> listeners when the listeners are  spread out over dozens of properties, and 
>> although high in total number, the total listeners per property would be low 
>> and their listener lists would be short.  Performance of short lists (<50 
>> entries) is almost unbeatable, so it is relevant for this PR to know if 
>> there are any properties with long listener lists.
>
> @hjohn 
> I haven't quantified exactly where all the listeners are coming from but the 
> Node class for example has various listeners on it.
> 
> The following changeset  (which added an extra listener on the Node class) 
> impacted TableView performance significantly (although it was still bad 
> before this change in my previous tests):
> 
>> commit e21606d3a1b73cd4b44383babc750a4b4721edfd
>> Author: Florian Kirmaier <fk at sandec.de<mailto:fk at sandec.de>>
>> Date:   Tue Jan 22 09:08:36 2019 -0800
>> 
>>     8216377: Fix memoryleak for initial nodes of Window
>>     8207837: Indeterminate ProgressBar does not animate if content is added 
>> after scene is set on window
>> 
>>     Add or remove the windowShowingChangedListener when the scene changes
> 
> As you can imagine, a TableView with many columns and rows can be made up of 
> many Node classes. The impact of having multiple listeners deregistering on 
> the Node when new rows are being added to a TableView can be a significant 
> performance hit on the JavaFX thread. 
> 
> I don't have the time or knowledge to investigate why these listeners are all 
> needed especially around the Node class. I went directly to the source of the 
> problem which was the linear search to deregister each listener.
> 
> I have been running my proposed fix in our JavaFX application for the past 
> few months and it has saved it from being unusable due to the JavaFx thread 
> being swamped.

The patch proposed here does not share the case where the listener deletion 
performance becomes a bottleneck.

I think that it is necessary to reproduce it by testing first, but

If you just focus on improving listener removal performance,

If the lifespan of a large number of registered listeners is biased,
It seems like the next simple change can improve delete performance without 
changing the data structure.

* Change the search from the front of the list to the search from the back.

This will reduce the number of long-life listeners matching.

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

PR: https://git.openjdk.java.net/jfx/pull/108

Reply via email to