2012-07-13 79 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

相關問題