java - 有没有一种方法可以更快地编译/加载 fxml 文件并且仅一次,而不是在每次重新启动应用程序时?

标签 java javafx javafx-2 runtime javafx-8

我有一个程序在执行时会加载许多 fxml 文件。应用程序将在短时间内完成,而加载应用程序所需的时间太长。

有很多 fxml 文件(20 多个),所有这些 fxml 文件都加载了 Java 代码。应用程序已完成并可以使用,但每次执行程序时都会加载所有文件。 fxml 文件只能编译一次,因为完成后不会更改吗?

java代码当然会被编译一次,它只是fxml文件。应用程序现在需要 25 秒才能启动,加载 fxml 需要 14 秒。

有没有办法让这一切变得更快?

编辑#1:

是否有任何免费提供的工具可以使应用程序 (Java) 的执行速度更快?还是执行时间仅取决于程序的编写方式?

哪些设计模式可以帮助缩短应用程序的执行时间?

编辑#2:

下面的代码将简要说明我的问题:

package main;

.......
.......

public class MainClass {

    ....
    ....

    List<InformationController> controllerList;

    public mainClass(List<InformationControllers> controllerList) {
        this.controllerList = otherClass.getControllerList();
        loadFXMLFiles();
    }

    public void loadFXMLFiles() {
        for(InformationController controller : controllerList) {
            controller.loadFXML();
        }
        doOtherStuff();
    }

    ....

}

所有这些 InformationController 也加载了其他 fxml 文件,所以它实际上是加载的 fxml 文件树。这是在应用程序每次启动时加载的,那么有没有办法只加载一次?

最佳答案

关于如何加快 FXML 性能

我会将这个答案制作成社区维基,如果其他人有进一步的想法,请编辑并添加。

  1. 不应使用静态 FXMLLoader.load()但应该改为 create an instance of FXMLLoader并使用实例重用那个 loader.load()方法。原因是 FXML-Loader 缓存,例如类查找,因此加载下一个 FXML 文件的速度更快。
  2. 使用工具将 FXML 编译为 Java,例如 Tom Schindl's FXML compilerNetBeans FXML to Java converter .
  3. 在任何给定时间都不要加载超出您需要的 FXML,例如如果您现在不打算显示它,请不要加载它。
  4. 在后台线程中加载 FXML(不适用于某些控件类型,例如 Java 8 中的工具提示)。
  5. 加载初始登录或 splash screen首先,然后在显示初始屏幕或登录屏幕时加载其余的 FXML。在登录屏幕上接受凭据后,我在某些应用程序中加载 FXML。
  6. 通过删除不必要的节点来降低应用程序 UI 的复杂性。
  7. 确保您没有在 Controller 的初始化方法中对 JavaFX UI 线程执行不必要的工作(例如读取数据库)。
  8. FXMLLoader.load() JavaFX 8 中的文档包括对 FXML 模板的引用,但我认为它从未实现过,所以它可能对你没有帮助。
  9. 我听说提到 static methods from FXML很慢。
  10. 使用latest development version of JavaFX .
  11. 从 FXML 加载节点层次结构后,稍后重用该层次结构而不是将其丢弃并加载新的层次结构(例如,如果您有一个对话窗口,其内容使用 FXML 构建,当用户关闭对话框时,只需隐藏它以及当您需要再次显示类似对话框时,只需显示隐藏的对话框而不是构建一个全新的对话框和场景图)。

反射是 FXML 慢的原因

我认为 Java 8 FXML 实现缓慢的主要原因是它严重依赖反射和 reflection is slowreflection tutorial 中所述:

Because reflection involves types that are dynamically resolved, certain Java virtual machine optimizations can not be performed. Consequently, reflective operations have slower performance than their non-reflective counterparts, and should be avoided in sections of code which are called frequently in performance-sensitive applications.

关于java - 有没有一种方法可以更快地编译/加载 fxml 文件并且仅一次,而不是在每次重新启动应用程序时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24077524/

相关文章:

java - 数组索引越界异常 -77

java - 使用 "begin with"而不是 "contains"重新搜索查询

javafx - 发生异常 :Root value already specified in Javafx when loading fxml page for the second time

java - 如何在 JavaFX 中创建一个 run-while-while-button-is-pushed 类型的按钮?

JavaFX 2 - 捕获所有运行时异常

java - 引导 Play 应用程序

java - 以编程方式查找给定函数的周期性

user-interface - 如何使用 JavaFX 中可见的行号实现 TextArea?

java - getChildren() add() 和 add()

java - 必须使用 javaFX 搜索和删除按钮制作地址簿