我在HPC工作。我有一个applet和一个Java客户端应用程序,它通过从我们的TORQUE作业调度程序收到的信息显示有关在集群上运行的作业(jobID, jobname, userID, etc.
)的信息。
最近,我添加了按钮,按类别按升序或降序对数据进行排序。通过这种添加,用户可以通过对数据进行排序来强制更新显示(之前我有一个定时器,每10秒从服务器接收一次新数据并随后更新显示),我注意到性能上的差异 - 小程序显着滞后。放入计时代码,我发现应用程序平均花费0.05秒到setContentPane()
,而applet平均花费1.50秒来使用相同的代码执行相同的操作。无论applet是在appletviewer还是浏览器中运行,这个问题都是一样的。
我想强调几乎所有的代码都是一样的。唯一重要的区别是JApplet对自身进行setContentPane()
(和其他)调用,而我的应用程序在JFrame上进行调用(例如frame.setContentPane()
)。
奇怪的是,第一次调用applet的setContentPane()
会在~0.13秒内返回。但是,所有后续呼叫都需要先前提到的时间。
有什么建议吗?我宁愿拥有一个正常运行的applet,所以我不必将应用程序推送到我的用户社区。 p>
编辑:JApplet的事件处理不是问题:关于鼠标移动和位置读取的性能以及玻璃窗格上的弹出绘图在JApplet和Java应用程序之间是相同的。
Edit2:我刚编辑了JApplet代码,因此弹出JFrame,内部运行的应用程序和性能与应用程序的性能相匹配! Applet有什么用?几周以来我一直在阅读它们,没有人能够解释这个问题 - 它几乎完全是“applet不能在我的linux盒子上的firefox浏览器中运行”或者“我如何将我的应用程序变成applet”。没有人能告诉我为什么相同的相同的GUI代码在JApplet中运行速度非常慢。也就是说,为什么setContentPane()在从JFrame创建的JApplet中减速30倍?
我运行applet的原因是因为我希望它嵌入在网页中,弹出的JFrame太过于干扰。想法?
Edit3:在继续我对此问题的诊断时,我发现JApplet对setContentPane()的调用使我的CPU使用率高达60-100%。这不是应用程序的setContentPane()的情况,它只会从0.1%跳到~4%。是什么导致JApplet的所有运营和性能负担开销?
答案 0 :(得分:3)
重构您的应用程序以使用此hybrid方法。它有两个优点:
您可以更直接地分析不同top-level containers的开销。
您可以使用java-web-start获得更灵活的部署选项,图示为here。
答案 1 :(得分:3)
奇怪的是,第一次调用applet的setContentPane()会在~0.13秒内返回。但是,..有什么建议吗?
在第一次通话中,添加一个CardLayout
的面板。切勿再次拨打setContentPane()
,而是使用带卡布局的面板“添加”更多内容。
答案 2 :(得分:1)
不幸的是,相比之下,Applet的运行速度会慢一些。很大程度上取决于浏览器的JVM和对Applet请求的响应。这是他们很少使用的原因之一。