On Wed, 26 Aug 2020 15:40:57 GMT, Jose Pereda <jper...@openjdk.org> wrote:

>> I have attached a code sample. If you use OpenJFX 16-ea+1 and run visual VM 
>> and look at the hotspots in the JavaFX thread, you can see that about 45% of 
>> the time in the JavaFX thread is spent in removeListener calls.
>> 
>> Note: In CPU settings of VisualVM, I removed all packages from the "Do not 
>> profile packages section".
>> 
>> [JavaFXSluggish.java.zip](https://github.com/openjdk/jfx/files/5130298/JavaFXSluggish.java.zip)
>
> So far, there are two alternative fixes for the bad performance issue while 
> scrolling TableView/TreeTableViews: 
> 
> - this one #108, that tries to improve the performance of excessive number of 
> `removeListener` calls
> - the WIP #185 that avoids registering two listeners (on Scene and on Window) 
> for each and every Node.
> 
> For the case presented, where new items are constantly added to the 
> TableView, the trace of calls that reach 
> `com.sun.javafx.binding.ExpressionHelper.removeListener()` is something like 
> this:
> 
> ![TraceOpenJFX16ea1](https://user-images.githubusercontent.com/2043230/91322208-c2ba9900-e7bf-11ea-8918-cdbecd457cf2.png)
>  
> As can be seen, all those calls are triggered by the change of the number of 
> cells in 
> [VirtualFlow::setCellCount](https://github.com/openjdk/jfx/blob/master/modules/javafx.controls/src/main/java/javafx/scene/control/skin/VirtualFlow.java#L804).
> 
> Whenever the cell count changes there is this 
> [call](https://github.com/openjdk/jfx/blob/master/modules/javafx.controls/src/main/java/javafx/scene/control/skin/VirtualFlow.java#L843):
>  
> 
> sheetChildren.clear();
> 
> This happens every time the number of items in the `TableView` changes, as 
> the `VirtualFlow` keeps track of the number of virtual cells (`cellCount` is 
> the total number of items) while the number of actual cells or number of 
> visible nodes used is given by `sheetChildren.size()`.
> 
> This means that all the actual cells (nodes) that are used by the 
> `VirtualFlow` are disposed and recreated all over again every time the number 
> of items changes, triggering all those calls to unregister those nodes from 
> the scene that ultimately lead to remove the listeners with 
> `ExpressionHelper.removeListener`.
> 
> However, this seems unnecessary, as the number of actual cells/nodes doesn't 
> change that much, and causes this very bad performance.
> 
> On a quick test over the sample posted, just removing that line gives a 
> noticeable improvement in performance..
> 
> There is a concern though due to the 
> [comment](https://github.com/openjdk/jfx/blob/master/modules/javafx.controls/src/main/java/javafx/scene/control/skin/VirtualFlow.java#L839):
> 
> // Fix for RT-13965: Without this line of code, the number of items in
> // the sheet would constantly grow, leaking memory for the life of the
> // application. This was especially apparent when the total number of
> // cells changes - regardless of whether it became bigger or smaller.
> sheetChildren.clear();
> 
> There are some methods in VirtualFlow that already manage the lifecycle of 
> this list of nodes (clear, remove cells, add cells, ...), so I don't think 
> that is the case anymore for that comment: the number of items in the sheet 
> doesn't constantly grow and there is no memory leak.
> 
> Running the attached sample for a long time, and profiling with VisualVM, 
> shows improved performance (considerable drop in CPU usage), and no issues 
> regarding memory usage.
> 
> So I'd like to propose this third alternative, which would affect only 
> VirtualFlow and the controls that use it, but wouldn't have any impact in the 
> rest of controls as the other two options (as `ExpressionHelper` or `Node` 
> listeners wouldn't be modified).
> 
> Thoughts and feedback are welcome.

I confirmed the sample code (JavaFX Sluggish),
This is not scroll performance
It seems to reproduce the additional performance issue.
Therefore, it is not considered appropriate as a fix for JDK-8185886.
I know you are reproducing another performance issue, but
I'm proposing to fix scrolling performance issues in #125.

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

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

Reply via email to