Hi, I was going to ask if it was possible to reopen JDK-8151756 ( https://bugs.openjdk.java.net/browse/JDK-8151756) since it was fixed but reverted in JDK-8183100 (https://bugs.openjdk.java.net/browse/JDK-8183100) after causing several regressions. I only noticed now that a followup bug was created: JDK-8193445 which reopens the issue.
The code below demonstrates the problem where adding nodes to the scene graph all at once performs exponentially slower than adding them one by one. I get the following results with jfx11.0.1: One by one: 138ms All at once: 16704ms I've made a potential fix, different to the one tried previously which applies the css as if the nodes were being added one by one: https://github.com/DeanWookey/openjdk-jfx/commit/65a1ed82bce262294f1969e9a12e1126ec8a1ec6 It passes the main tests, as well as the systemTest JDK8183100Test.java from https://bugs.openjdk.java.net/browse/JDK-8193494. This is probably not a suitable issue to work on for a first time contributor, but perhaps I could work on a performance test if someone can point me in the direction of existing performance tests? Dean package applycsstest; import javafx.application.Application; import javafx.application.Platform; import javafx.scene.Scene; import javafx.scene.layout.StackPane; import javafx.stage.Stage; /** * * @author Dean */ public class ApplyCssTest extends Application { @Override public void start(Stage primaryStage) { System.out.println("One by one: " + addToSceneOneByOne() + "ms"); System.out.println("All at once: " + addToSceneAllAtOnce() + "ms"); Platform.exit(); } public static void main(String[] args) { launch(args); } public long addToSceneOneByOne() { StackPane root = new StackPane(); Scene scene = new Scene(root, 300, 250); long start = System.currentTimeMillis(); StackPane firstChild = new StackPane(); root.getChildren().add(firstChild); //add to the scene graph first addNodesOneByOne(1000, firstChild); //then add children one by one return System.currentTimeMillis() - start; } public long addToSceneAllAtOnce() { StackPane root = new StackPane(); Scene scene = new Scene(root, 300, 250); long start = System.currentTimeMillis(); StackPane firstChild = new StackPane(); addNodesOneByOne(1000, firstChild); //build the node up, then root.getChildren().add(firstChild); //add to scene graph all at once return System.currentTimeMillis() - start; } public void addNodesOneByOne(int numToAdd, StackPane parent) { StackPane last = parent; for (int i = 0; i < numToAdd; i++) { StackPane curr = new StackPane(); last.getChildren().add(curr); last = curr; } } }