On Thu, 14 Nov 2019 18:33:05 GMT, Kevin Rushforth <k...@openjdk.org> wrote:

> On Tue, 12 Nov 2019 16:45:04 GMT, Ajit Ghaisas <aghai...@openjdk.org> wrote:
> 
>> **Issue :**
>> https://bugs.openjdk.java.net/browse/JDK-8193445
>> 
>> **Background :**
>> The CSS performance improvement done in 
>> [JDK-8151756](https://bugs.openjdk.java.net/browse/JDK-8151756) had to be 
>> backed out due to functional regressions reported in 
>> [JDK-8185709](https://bugs.openjdk.java.net/browse/JDK-8185709), 
>> [JDK-8183100](https://bugs.openjdk.java.net/browse/JDK-8183100) and 
>> [JDK-8168951](https://bugs.openjdk.java.net/browse/JDK-8168951).
>> Refer to [JDK-8183100](https://bugs.openjdk.java.net/browse/JDK-8183100) for 
>> more details on this backout. 
>> 
>> **Description :**
>> This PR reintroduces the CSS performance improvement fix done in 
>> [JDK-8151756](https://bugs.openjdk.java.net/browse/JDK-8151756) while 
>> addressing the functional regressions that were reported in 
>> [JDK-8185709](https://bugs.openjdk.java.net/browse/JDK-8185709), 
>> [JDK-8183100](https://bugs.openjdk.java.net/browse/JDK-8183100) and 
>> [JDK-8168951](https://bugs.openjdk.java.net/browse/JDK-8168951).
>> For ease of review, I have made two separate commits -
>> 1) [Commit 
>> 1](https://github.com/openjdk/jfx/pull/34/commits/d964675ebc2a42f2fd6928b773819502683f2334)
>>  - Reintroduces the CSS performance improvement fix done in 
>> [JDK-8151756](https://bugs.openjdk.java.net/browse/JDK-8151756) - most of 
>> the patch applied cleanly.
>> 2) [Commit 2 
>> ](https://github.com/openjdk/jfx/pull/34/commits/12ea8220a730ff8d98d520ce870691d54f0de00f)-
>>  fixes the functional regressions keeping performance improvement intact + 
>> adds a system test
>> 
>> **Root Cause :**
>> CSS performance improvement fix proposed in [JDK-8151756 
>> ](https://bugs.openjdk.java.net/browse/JDK-8151756)correctly avoids the 
>> redundant CSS reapplication to children of a Parent. 
>> What was missed earlier in [JDK-8151756 
>> ](https://bugs.openjdk.java.net/browse/JDK-8151756) fix : "CSS reapplication 
>> to the Parent itself”. 
>> This missing piece was the root cause of all functional regressions reported 
>> against [JDK-8151756](https://bugs.openjdk.java.net/browse/JDK-8151756)
>> 
>> **Fix :**
>> Fixed the identified root cause. See commit 2.
>> 
>> **Testing :**
>> 1. All passing unit tests continue to pass
>> 2. New system test (based on 
>> [JDK-8209830](https://bugs.openjdk.java.net/browse/JDK-8209830)) added in 
>> this PR - fails before this fix and passes after the fix
>> 3. System test JDK8183100Test continues to pass
>> 4. All test cases attached to regressions 
>> [JDK-8185709](https://bugs.openjdk.java.net/browse/JDK-8185709), 
>> [JDK-8183100](https://bugs.openjdk.java.net/browse/JDK-8183100) and 
>> [JDK-8168951](https://bugs.openjdk.java.net/browse/JDK-8168951) pass with 
>> this fix
>> 
>> In addition, testing by community with specific CSS performance / 
>> functionality will be helpful.
>> 
>> ----------------
>> 
>> Commits:
>>  - 12ea8220: Fix for functional regressions of JDK-8151756 + add a sytem test
>>  - d964675e: Reintroduce JDK-8151756 CSS performance fix
>> 
>> Changes: https://git.openjdk.java.net/jfx/pull/34/files
>>  Webrev: https://webrevs.openjdk.java.net/jfx/34/webrev.00
>>   Issue: https://bugs.openjdk.java.net/browse/JDK-8193445
>>   Stats: 121 lines in 5 files changed: 104 ins; 0 del; 17 mod
>>   Patch: https://git.openjdk.java.net/jfx/pull/34.diff
>>   Fetch: git fetch https://git.openjdk.java.net/jfx pull/34/head:pull/34
> 
> While we are still discussing the fix itself, I added a few comments on the 
> new test. It generally looks good, but should be run on a variety of systems, 
> with and without the fix (once we have a final fix that we are satisfied 
> with).
> 
> tests/system/src/test/java/test/robot/javafx/scene/CSSPerf_JDK8193445Test.java
>  line 26:
> 
>> 25: 
>> 26: package test.robot.javafx.scene;
>> 27: 
> 
> There is no need for this test to require robot. I recommend moving it to 
> `test.javafx.scene` (and not inherit from `VisualTestBase`).
> 
> tests/system/src/test/java/test/robot/javafx/scene/CSSPerf_JDK8193445Test.java
>  line 55:
> 
>> 54: 
>> 55: public class CSSPerf_JDK8193445Test extends VisualTestBase {
>> 56: 
> 
> We have moved away from putting the bug ID in the test class name, so I 
> recommend renaming it.
> 
> tests/system/src/test/java/test/robot/javafx/scene/CSSPerf_JDK8193445Test.java
>  line 78:
> 
>> 77:             HBox hbox = new HBox();
>> 78:             for (int i = 0; i < 300; i++) {
>> 79:                 hbox = new HBox(new Text("y"), hbox);
> 
> In my testing on various machines, the bug is more pronounced, and less prone 
> to system differences with `500` nodes instead of `300`.
> 
> tests/system/src/test/java/test/robot/javafx/scene/CSSPerf_JDK8193445Test.java
>  line 94:
> 
>> 93:         // It is good enough to catch the regression in performance, if 
>> any
>> 94:         assertTrue("Time to add 300 Nodes is more than 400 mSec", mSec < 
>> 400);
>> 95:     }
> 
> If you increase the number of nodes to `500` then I recommend bumping the 
> time threshold to `800` msec in case it is run on a very slow system.

> I think inverting the call is fine. That's what I did in my fix 
> ([DeanWookey/openjdk-jfx@65a1ed8](https://github.com/DeanWookey/openjdk-jfx/commit/65a1ed82bce262294f1969e9a12e1126ec8a1ec6))
>  and we've been testing that out thoroughly for over a year.
> 
> It's as if you are adding nodes 1 by 1 to the scene graph, something we know 
> works and is fast. My change tries to emulate that more accurately to avoid 
> side effects. Theoretically, we should be able to do better when many nodes 
> are added at once because we have all the information upfront.
> 
> The one side effect I can see by only applying commit 2 is that the first 
> call of reapplyCSS() calls reapplyCss on every node in the tree and that sets 
> the cssFlag = CssFlags.UPDATE;. The subsequent calls will hit this in 
> reapplyCSS():
> 
> ```
>         if (cssFlag == CssFlags.UPDATE) {
>             cssFlag = CssFlags.REAPPLY;
>             notifyParentsOfInvalidatedCSS();
>             return;
>         }
> ```
> 
> and return without doing all the unnecessary work. As a result however, 
> instead of leaving with cssFlag = CssFlags.UPDATE, all the nodes leave with 
> CssFlags.REAPPLY. That might cause an unnecessary css pass later?
> 
> Doing it in the order it happens now, that check for the update flag 
> shouldn't be true because its bottom up.

It is a good observation about cssFlag. I have not seen any side effect with 
the limited testing that I have done. It may be possible that the "unnecessary 
css pass later" scenario is not covered by the test cases that we have.

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

Reply via email to