【问题标题】:Why is Scala JavaFX application slowing down when run from .jar instead of using sbt run?为什么从 .jar 运行而不是使用 sbt run 时 Scala JavaFX 应用程序会变慢?
【发布时间】:2017-02-06 11:56:08
【问题描述】:

我正在为我应该在这里展示什么代码而苦恼,因为它非常复杂,而且它同时工作。

问题是我构建了一个相对复杂的 JavaFX 场景图,并用它从 Scala 应用程序更新了 VBox 的内容。

现在,当我在控制台窗口中使用 sbt run 运行应用程序时,sceneragph 加载速度很快。当我从打包的 .jar 运行它时(我为此使用 sbt-one-jar),场景需要很长时间才能加载。

所以一切正常,一切正常,除了从 .jar 运行会神奇地减慢速度。

反正我贴了一些代码,虽然不是很有启发性:

def SetVboxSceneGraph(
    id:String,
    blob:String,
    handler:(MyEvent)=>Unit
)
{
    val comp=MyComponent.FromBlob(blob,handler)

    comp.CreateNode

    val box=GetMyBox(id)

    val vbox=box.GetNode.asInstanceOf[VBox]

    vbox.getChildren().clear()

    vbox.getChildren().add(comp.GetParent)
}

编辑:

根据 sillyfly 的建议,我测量了每一步更新场景图的时间。减慢的步骤是:

        comp.CreateNode

这是负责从 XML 标记(作为“blob”传递)构建 JavaFX 场景图的部分,我开发该标记来描述所谓的“MyComponent”,它们是从现有 JavaFX 小部件构建自定义小部件的类。构建场景图后,更新所需的时间相同。

【问题讨论】:

  • 任何场景图都会发生这种情况,还是内容很重要?您能否尝试缩小哪个步骤需要更多时间,例如 System.nanoTime(参见 this answer)?
  • 我还想到,知道哪一步确实慢下来会很有用。我在应用程序中有一个 Timer 类,它使用 System.nanoTime 并且可以以不同的单位报告经过的时间。如果我知道哪个步骤负责,我会更新问题。
  • 问题已更新。
  • 好吧,既然您知道哪种方法很慢,如果您可以将其包含在问题中(或将其缩小到您可以发布的MCVE)可能会有所帮助。
  • 方法没问题,不然在sbt run下跑不快。如果它有任何系统问题,它也会在 sbt run 下运行缓慢。代码太复杂,无法缩小范围,这里是完整的来源:github.com/scalasbtguiapps/test/blob/master/src/main/scala/…。它基本上将每个 MyComponent 转换为各自的 JavaFX 场景图( MyComponents 可能包含多个小部件)。它递归地执行此操作,因此构建图的父组件会构建整个图。

标签: performance scala javafx sbt scenegraph


【解决方案1】:

可能有两件事会减慢您的启动速度:加载类和增加 JVM 堆。也有可能您为应用程序分配的内存较少,这会降低整体速度。

除非您在build.sbt 中设置了fork := true,否则您将在与构建相同的java 进程中运行您的应用程序。这意味着您的所有启动税(类加载、堆增长)都已支付。

很遗憾,没有办法加快类加载。但是,您可以通过将XmsXmx 标志设置为java 命令来显着加快堆增长:

# This is 2 GB. Pick an appropriate value for your app. 
java -Xms2g -Xmx2g -jar my.jar

【讨论】:

  • 先做一个技术观察:内存大小前面的冒号会报错,所以只有-Xms2g和-Xmx2g。不幸的是,无论我选择多大的堆参数,执行都不会加快(如果我选择了一个勉强足够的堆大小,它也不会减慢)。不管我做什么,使用 sbt run 仍然更快。
  • 对不起,冒号是错误的。如果你仍然有减速,它可能只是类加载。您总是可以尝试使用更优化的类路径拆分为多个 jar,但这不太可能有太大帮助。
  • 我必须吸取的教训是,与其在内容更改时构建场景图,不如只构建一次场景图然后在内容更改时更新每个组件以显示实际内容。而不是可滚动的内容列表,只显示固定格式的内容页面。这在编程和外观方面都不太优雅,但至少它有效。我不得不接受在 JavaFX 中构建大屏幕图的成本很高的现实。
猜你喜欢
  • 2014-01-17
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
  • 2011-02-25
  • 2021-09-05
  • 2016-01-10
相关资源
最近更新 更多