[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openjdk-openjfx-dev
Subject:    Re: RFR: 8197991: Selecting many items in a TableView is very slow [v3]
From:       yosbits <github.com+7517141+yososs () openjdk ! java ! net>
Date:       2020-12-30 8:41:55
Message-ID: TOz8dLRf2jmRNjiT43FIg7p-bLHA8Lb2FXnJbZfetik=.296eec57-58cd-4868-94d3-a99532ad6995 () github ! com
[Download RAW message or body]

On Tue, 29 Dec 2020 09:50:42 GMT, Jose Pereda <jpereda@openjdk.org> wrote:

> > I commented.
> 
> I've run SelectListView and SelectTableView tests and both run fine. As for the \
> SelectTableView test, with 700_000 rows, when there is no selection, pressing \
> SelectToEnd takes around 3.1 seconds, as expected. However, if there is one single \
> row selected, after pressing SelectToEnd, the selection doesn't complete, and I \
> have to abort and quit the app.  
> Instead of:
> tableView.getSelectionModel().selectRange(tableView.getSelectionModel().getFocusedIndex(), \
> tableView.getItems().size()); this:
> int focusedIndex = tableView.getSelectionModel().getFocusedIndex();
> tableView.getSelectionModel().clearSelection();
> tableView.getSelectionModel().selectRange(focusedIndex, \
> tableView.getItems().size()); seems to work and times are again around 3 seconds or \
> less. 
> Maybe you can check why that is happening?
> 
> And about the test discussion above, I understand that running the included tests \
> as part of the automated test wouldn't make much sense (as these can take too \
> long). However, maybe these could be added as unit tests with a reduced number of \
> item/rows. Instead of measuring performance (selection times would depend on each \
> machine), I'd say you could simply verify that selection works as expected. 
> While most of the changes are just about caching `size()`, the new implementation \
> of `MultipleSelectionModelBase::indexOf` adds some new code that should be tested, \
> as part of the unit tests, again not for performance, but to assert it returns the \
> expected values.

As an overview, the new implementation can handle selectRange up to 50_000 records. \
This assumes general manual operation. However, after clearing the selection (a rare \
operation in manual operation), it is as efficient as selectAll. However, this is a \
two-time change.

The response difference is caused by the next conditional branch (size == 0) of \
SortedList. This will be the next hotspot to improve as seen by this improvement.

I can't include it in this PR because I don't have time to work.

I haven't tried it, but if I change the per-record insertToMapping call of this \
method to per-range setAllToMapping, the performance seems to be around selectAll.

javafx.collections.transformation.SortedList.java
 SortedList.java
    private void addRemove(Change<? extends E> c) {
        if (c.getFrom() == 0 && c.getRemovedSize() == size) {
            removeAllFromMapping();
        } else {
            for (int i = 0, sz = c.getRemovedSize(); i < sz; ++i) {
                removeFromMapping(c.getFrom(), c.getRemoved().get(i));
            }
        }
        if (size == 0) {
            setAllToMapping(c.getList(), c.getTo()); // This is basically equivalent \
                to getAddedSubList
                                                     // as size is 0, only valid \
"from" is also 0  } else {
            for (int i = c.getFrom(), to = c.getTo(); i < to; ++i) {
                insertToMapping(c.getList().get(i), i);
            }
        }
    }

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

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


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic