On Tue, 25 Feb 2020 13:55:50 GMT, Nir Lisker <[email protected]> wrote:
>> Replying to @nlisker and @kevinrushforth general comments about the memory
>> consumption of using a LinkedHashMap:
>>
>> I agree that at the very least these should be lazy initialised when they
>> are needed and that we should initially allocate a small capacity and load
>> factor.
>>
>> We could also have some sort of strategy where we could use arrays or lists
>> if the number of listeners are less than some threshold (i.e. keeping the
>> implementation with a similar overhead to the original) and then switch to
>> the HashMap when it exceeds this threshold. This would make the code more
>> complicated and I wonder if this is the worth the extra complexity.
>>
>> I know that in our application, the thousands of listeners unregistering
>> when using a TableView was stalling the JavaFX thread.
>>
>> I am happy to submit code that lazy initialises and minimises initial
>> capacity and load factor as suggested or happy to take direction and
>> suggestions from anyone with a deeper understanding of the code than myself.
>
> I think that a starting point would be to decide on a spec for the listener
> notification order: is it specified by their registration order, or that is
> it unspecified, in which case we can take advantage of this for better
> performance. Leaving is unspecified and restricting ourselves to having it
> ordered is losing on both sides.
Even though the order of notifications is unspecified, the following tests fail
if we use a HashMap vs LinkedHashMap i.e. the notifications are not in order of
registration:
test.javafx.scene.control.TableViewTest >
ensureSelectionIsCorrectWhenItemsChange FAILED
java.lang.AssertionError: expected:<0> but was:<-1>
at org.junit.Assert.fail(Assert.java:91)
at org.junit.Assert.failNotEquals(Assert.java:645)
at org.junit.Assert.assertEquals(Assert.java:126)
at org.junit.Assert.assertEquals(Assert.java:470)
at org.junit.Assert.assertEquals(Assert.java:454)
at
test.javafx.scene.control.TableViewTest.ensureSelectionIsCorrectWhenItemsChange(TableViewTest.java:333)
test.javafx.scene.control.TreeTableViewTest >
test_rt27180_expandBranch_laterSiblingSelected_singleSelection FAILED
java.lang.AssertionError:
at org.junit.Assert.fail(Assert.java:91)
at org.junit.Assert.assertTrue(Assert.java:43)
at org.junit.Assert.assertTrue(Assert.java:54)
at
test.javafx.scene.control.TreeTableViewTest.test_rt27180_expandBranch_laterSiblingSelected_singleSelection(TreeTableViewTest.java:2042)
test.javafx.scene.control.TreeViewTest > test_rt27185 FAILED
java.lang.AssertionError: expected:<TreeItem [ value: Mike Graham ]> but
was:<null>
at org.junit.Assert.fail(Assert.java:91)
at org.junit.Assert.failNotEquals(Assert.java:645)
at org.junit.Assert.assertEquals(Assert.java:126)
at org.junit.Assert.assertEquals(Assert.java:145)
at
test.javafx.scene.control.TreeViewTest.test_rt27185(TreeViewTest.java:603)
test.javafx.scene.control.TreeViewTest >
test_rt27180_collapseBranch_laterSiblingAndChildrenSelected FAILED
java.lang.AssertionError:
at org.junit.Assert.fail(Assert.java:91)
at org.junit.Assert.assertTrue(Assert.java:43)
at org.junit.Assert.assertTrue(Assert.java:54)
at
test.javafx.scene.control.TreeViewTest.test_rt27180_collapseBranch_laterSiblingAndChildrenSelected(TreeViewTest.java:973)
test.javafx.scene.control.TreeViewTest >
test_rt27180_expandBranch_laterSiblingSelected_singleSelection FAILED
java.lang.AssertionError:
at org.junit.Assert.fail(Assert.java:91)
at org.junit.Assert.assertTrue(Assert.java:43)
at org.junit.Assert.assertTrue(Assert.java:54)
at
test.javafx.scene.control.TreeViewTest.test_rt27180_expandBranch_laterSiblingSelected_singleSelection(TreeViewTest.java:992)
These would need to be investigated to see why they assume this order.
-------------
PR: https://git.openjdk.java.net/jfx/pull/108