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