【问题标题】:JApplet runs 30x slower than Java application GUIJApplet 运行速度比 Java 应用程序 GUI 慢 30 倍
【发布时间】:2012-07-13 20:03:22
【问题描述】:

我在 HPC 工作。我有一个小程序和一个 Java 客户端应用程序,它们通过从我们的 TORQUE 作业调度程序接收到的信息显示有关在集群上运行的作业 (jobID, jobname, userID, etc.) 的信息。

最近,我添加了按钮来按类别按升序或降序对数据进行排序。有了这个附加功能,用户可以通过对数据进行排序来强制更新显示(以前我有一个计时器,它每 10 秒从服务器接收一次新数据,然后更新显示),我注意到性能上的差异- 小程序明显滞后。输入计时代码,我发现应用程序平均需要 0.05 秒才能到达setContentPane(),而小程序平均需要 1.50 秒才能使用相同的代码执行相同的操作。无论小程序是在 appletviewer 还是在浏览器中运行,这个问题都是一样的。

我想强调的是,几乎所有代码都是相同的。唯一显着的区别是 JApplet 对自己进行 setContentPane() (和其他)调用,而我的应用程序在 JFrame 上进行这些调用(例如 frame.setContentPane() )。

奇怪的是,对小程序的第一次调用 setContentPane() 会在大约 0.13 秒内返回。但是,所有后续调用都需要前面提到的时间。

有什么建议吗?我宁愿拥有一个正常运行的小程序,这样我就不必在我的用户社区上推送应用程序。

编辑:JApplet 的事件处理不是问题:关于鼠标移动和位置读取以及玻璃窗格上的弹出绘图的性能在 JApplet 和 Java 应用程序之间是相同的。

Edit2:我刚刚编辑了 JApplet 代码,因此会弹出一个 JFrame,其中运行着应用程序,并且性能与应用程序的性能相匹配! Applets 是什么?几周以来我一直在阅读它们,但没有人阐明这个问题——几乎完全是“小程序不能在我的 linux 机器上的 Firefox 浏览器中运行”或“我如何将我的应用程序变成一个小程序”。没有人能告诉我为什么相同的 GUI 代码实际上是相同 会在 JApplet 中运行得非常慢。也就是说,为什么 setContentPane() 在从 JFrame 创建的 JApplet 中有 30 倍的减速???

我运行小程序的原因是因为我希望它嵌入到网页中,弹出的 JFrame 太侵入性了。想法?

Edit3:在继续诊断此问题时,我发现 JApplet 对 setContentPane() 的调用使我的 CPU 使用率飙升至 60-100%。应用程序的 setContentPane() 并非如此,它只会从 0.1% 跳到 ~4%。是什么导致了 JApplet 的所有操作和性能开销?

【问题讨论】:

  • 你也可以试试appletviewer
  • “为方便起见,add 及其变体……已被覆盖以根据需要转发到 contentPane。”—JFrame

标签: java performance swing user-interface japplet


【解决方案1】:

重构您的应用程序以使用这种hybrid 方法。它有两个优点:

【讨论】:

  • 我已经在使用 SwingWorker 线程来创建新的显示面板,因此该操作的减速(通常小于 0.01 秒)是微不足道的。
  • Swing GUI 对象应event dispatch thread 上构造和操作。
  • 为什么提到SwingWorker?我们都猜到你在这两个应用程序中都使用了它。和小程序。
  • SwingWorker 也让我感到惊讶。 GUI 组件不应在工作线程的doInBackground() 线程上构建。后果无法预料。
【解决方案2】:

奇怪的是,对小程序的 setContentPane() 的第一次调用会在大约 0.13 秒内返回。但是,..有什么建议吗?

在第一次调用中,添加一个带有CardLayout 的面板。永远不要再打电话给setContentPane(),而是使用带有卡片布局的面板来“添加”更多内容。

【讨论】:

  • 这可能有效。虽然我需要一个玻璃面板来实现某些功能。我不确定如何在不向容器添加窗口的情况下执行此操作(不允许)。
  • 让我们知道您的进展情况。如果您无法管理它,请发布您的最佳尝试SSCCE
【解决方案3】:

不幸的是,相比之下,Applet 会运行得更慢。很大程度上取决于浏览器的 JVM 和对 Applet 请求的响应。这是它们很少使用的原因之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 2014-08-18
    • 2010-12-22
    • 2022-11-06
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多