2012-07-13 56 views
1

我在HPC中工作。我有一个applet和一个Java客户端应用程序,通过从我们的TORQUE作业调度程序收到的信息显示集群上运行的作业信息(jobID, jobname, userID, etc.)。JApplet比Java应用程序GUI运行速度慢30倍

最近,我添加了按钮来按类别按升序或降序排序数据。此外,用户可以通过对数据进行排序来强制更新显示器(之前我有一个计时器每隔10秒从服务器接收新数据并随后更新显示器),但我注意到性能不一致 - 小程序显着滞后。在计时代码中,我发现应用程序平均花了0.05秒到setContentPane(),而小程序花费了平均1.50秒来用相同的代码执行相同的操作。不管applet是在appletviewer还是浏览器中运行,这个问题都是一样的。

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

奇怪的是,第一次调用setContentPane()为小程序返回约0.13秒。但是,随后的所有呼叫都需要先前注意的时间。

有什么建议吗?我宁愿有一个功能正常的applet,所以我不必在我的用户社区推送应用程序。

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

编辑2:我刚刚编辑JApplet代码,以便JFrame弹出,应用程序在里面运行,性能与应用程序的匹配!小程序是什么?我已经阅读了几个星期的文章,但没有人明白这个问题 - 几乎完全是“applet不能在我的linux机器上的Firefox浏览器中运行”或“我如何将我的应用程序变成applet”。没有人可以告诉我为什么相同的GUI代码是字面上相同的将在JApplet内部运行得很慢。也就是说,为什么setContentPane()在从JFrame创建的JApplet中有30倍的减速?

我运行applet的原因是因为我想将它嵌入到网页中,弹出的JFrame太干扰了。思考?

Edit3:在继续对此问题进行诊断时,我发现JApplet对setContentPane()的调用使我的CPU使用率高达60-100%。对于应用程序的setContentPane(),情况并非如此,它只会从0.1%跳到〜4%。什么导致了JApplet的所有运营和性能税收开销?

+0

你也可以尝试'appletviewer'。 – trashgod 2012-07-14 19:30:02

+0

“为了方便起见,add和它的变体......已被覆盖,以便根据需要转发到”contentPane“。” - ['JFrame'](http://docs.oracle.com/javase/7/docs/api /javax/swing/JFrame.html) – trashgod 2012-07-14 19:30:20

回答

1

不幸的是,小苹果的运行速度会比较慢。很大程度上取决于浏览器的JVM和对Applet请求的响应。这是他们很少使用的原因之一。

3

重构你的应用程序以使用这种方法hybrid。它提供了两个优点:

+0

我已经在使用SwingWorker线程来创建新的显示面板,因此该操作的减速(通常小于0.01秒)是微不足道的。 – user1524486 2012-07-14 17:53:36

+0

Swing GUI对象应该在[事件派发线程](http://download.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)上的_only_上构建和操作。 – trashgod 2012-07-14 19:28:17

+0

为什么提到'SwingWorker'?我们都猜测你在两个应用程序中都使用它。 &applet。 – 2012-07-14 22:42:52

3

奇怪的是,在第一次调用setContentPane()在〜0.13秒小程序返回。但是,任何建议?

在第一次调用中,添加一个面板CardLayout。切勿再次致电setContentPane(),而是使用具有卡布局的面板“添加”更多内容。

+0

这可能工作。虽然我需要一些玻璃窗格来实现一些功能。我不确定如何在不向容器添加窗口的情况下执行此操作(不允许)。 – user1524486 2012-07-15 20:58:48

+1

让我们知道你是如何去的。如果您无法管理它,请发布最佳尝试[SSCCE](http://sscce.org/)。 – 2012-07-15 23:08:34

相关问题