2010-04-10 63 views
4

我想減少CPU使用率/ ROM使用率/ RAM使用率 - 通常,我的應用程序使用的所有系統資源 - 誰不? :)兩個程序如何在Java中相互交談?

由於這個原因,我想從應用程序的其餘部分, 拆分偏好窗口,並讓偏好窗口作爲獨立程序運行。

偏好程序應該寫入一個Property文件(根本不是問題),併發送一個「更新信號」給主程序 - 這意味着它應該調用找到的更新方法(我寫的)在Main類中。

如何從首選項程序調用主程序中的更新方法?

換句話說,當窗口出現時,構建偏好窗口的方法是將系統資源僅作爲

這種方法 - 分離程序並讓他們彼此交談(以某種方式) - 加速我的程序的正確方法?

+5

ROM的使用?什麼? – 2010-04-10 21:11:26

+3

流程是*昂貴*資源密集型的東西。他們不是免費的。偏好面板可能要求不高。除非您有多個流程的特定需求,否則不要使事情複雜化。儘可能保持簡單。您建議將更多資源集中起來,以使資源密集。不要這樣做。 – 2010-04-10 21:20:16

回答

9

你所描述的內容聽起來像是Premature Optimisation。如果你正在寫的東西不是玩具應用程序,重要的是要確信你的優化實際上解決了一個真正的問題。你的程序運行緩慢嗎?如果是這樣,你是否通過分析器運行它或以其他方式發現性能不佳的情況?

如果您確定要執行的操作將解決性能問題,我建議您查看在不同的線程中運行組件concurrently,而不是在不同的進程中運行。然後,您的組件可以避免互相阻塞,您將能夠利用多核處理器,並且不會承擔通過網絡套接字等進行進程間通信的複雜性和性能開銷。

+3

如果您在同一過程中設置單獨程序的首選項,則整體使用資源會更少。完成後請將其撕下。總的文件大小將會變小,總的內存佔用將會變小,並且會佔用更少的CPU資源。當您完成使用它們時,Java將釋放額外的資源。 – 2010-04-10 20:58:04

+0

+1爲過早優化 – Cam 2010-04-10 21:12:05

+0

我不認爲單獨的線程在這裏是有意義的,因爲UI代碼將最終全部運行在同一個線程上。事實上,如果你從UI線程中調用UI代碼,就會發生奇怪的事情。看到我的答案。 – 2010-05-13 14:25:27

1

您可以創建在主窗口中的ServerSocket並有偏好的應用程序連接到與使用的可能是非常簡單的一個普通Socket協議,但是......我想你應該看看第二個辦法:建立偏好窗口,當系統資源出現時就會佔用系統資源?

要做到這一點,你必須建立窗口和所有IT資源,直到用戶執行行動,保存文件(或將內容傳遞給主應用程序),並處理偏好的所有資源通過使其所有參考不可訪問。垃圾收集器將處理剩下的事情。

6

您可以使用套接字來回傳遞。 Here's a tutorial of how to do something similar.

不幸的是,我認爲這不會幫助你最大限度地減少CPU使用率,RAM等等......如果有的話可能會增加CPU使用率,RAM使用率等,因爲你需要運行兩個JVM而不是一個。除非你有一些令人難以置信的複雜的偏好窗口,否則你不需要花費那麼多資源來擔心它。通過添加網絡通信,您只需增加更多的複雜性而不會增加任何好處。

編輯:

如果你讀過這本書鉅富客戶端,這本書的要點之一就是豐富的效果並不需要是資源密集的。本書的大部分內容都致力於展示如何爲應用程序添加酷炫效果而不佔用大量資源。在整本書中,他們都非常小心地把所有事情都展示出來,以表明需要很長時間的事情,甚至沒有。當您的應用程序的資源不足時,這一點至關重要。編寫你的應用程序,看看什麼感覺很慢,爲那些緩慢的特定項目添加計時代碼,並加速代碼的特定部分。檢查你的計時代碼,看看它是否更快。沖洗並重復。否則,你正在做優化,可能沒有任何區別。如果沒有計算代碼的時間,即使您在優化之後加快了代碼速度,您也不知道代碼是否需要加速。

其他人提到在單獨的線程中加載屬性窗口。重要的是要記住,Swing只有one thread called the EDT可以將所有的像素繪製到屏幕上。任何導致屏幕像素改變的代碼都應該從EDT中調用,因此不應該從單獨的線程中調用。所以,如果你有一些可能需要一段時間才能運行的東西(可能是一個Web服務調用或者一些昂貴的計算),你可以從EDT啓動一個單獨的線程,當它完成時在EDT上運行代碼來執行UI更新。有諸如SwingWorker這樣的庫可以使這更容易。如果您將對話框設置爲可見,則不應該在單獨的線程中,但如果構建這些數據結構耗時,則可能需要在單獨的線程中構建數據結構。

使用Swing Worker是Filthy Rich Clients中許多有價值的創意之一,它使UI的感覺更具響應性。使用本書中的想法,我已經採取了一些相當耗費資源的UI,並使它們成爲UI,因此UI幾乎不使用任何資源。

+2

同意。 @Arnon:我會非常感興趣的是,聽到你認爲運行兩個獨立的程序會讓你的程序更高效。 – oltman 2010-04-10 20:54:32

+0

謝謝大家。 我的計劃是骯髒的富客戶端應用程序。 http://filthyrichclients.org/ 這意味着很多系統資源在使用中。 我的理解是,應用程序應該加載速度快,並儘可能快地響應用戶操作。 因爲首選項窗口並不總是被使用,所以我沒有找到在程序啓動時加載它的原因 - 但只是在需要的時候加載它。 這就是爲什麼我想分開他們彼此。 – Arnon 2010-04-11 17:17:58

1

也許你可以使用某種目錄觀察者,如this或者實現某種信號量。 老實說,如果你有某種用戶可以訪問的菜單項,我認爲你應該能夠解決這個問題。一旦用戶保存了首選項,它們就會寫入文件。應用程序隨後會在文件需要時加載文件中的值。 如果您的系統運行緩慢或掛起,您可能會考慮使用線程或增加線程數。

+0

偉大的鏈接到「觀看改變目錄」!我不知道這是可能的!我認爲這是解決這個問題的最佳方案。 – Jonas 2010-04-10 21:04:47

+1

我知道在C#上有類似的東西。 Java和C#的偉大之處在於有相當數量的API可以做類似的事情:D – npinti 2010-04-10 21:09:10

+1

可惜它是java 7 - 它很可能需要幾年時間才能在我們的目標平臺上可用... – 2010-04-11 07:30:41

0

實際上,正如其他人所解釋的那樣,您可以使用套接字進行進程間通信。 但是,這並不會降低您的整體CPU/RAM使用率。 (甚至可能會稍微惡化資源使用)

對於您的情況,您可以在不同的線程中啓動Perference窗口,而不是在不同的進程中啓動。 線程對於操作系統來說更輕,並且不會增加進程間通信的複雜性。

+0

Swing是單線程的。任何導致像素改變的代碼都應該從Swing線程或EDT中調用。你不能真正在一個線程中運行主UI,而在另一個線程中運行首選UI。如果你嘗試,可能會發生奇怪的事情。看到我的答案。 – 2010-05-13 14:28:54

+0

這就是SwingWorker進來的地方(正如你在你所說的那樣)。明顯的海報問題不是來自UI更新,而是UI驅動的任務。通常,Swing的緩衝策略非常有效,可以避免多餘的重新繪製。所以除非你在做一個過於複雜的anim循環,否則GUI性能應該會很好。 – Defd 2010-05-14 08:38:49

0

似乎沒有人提到DBUS - Linux系統上的開發人員可以使用它。我想如果你想製作Windows /跨平臺應用程序,這並不好,但DBUS是一個現成的應用程序通信平臺。它有助於解決諸如以下問題:

  • 其他人可能已經在使用您嘗試的端口。你無法爲你的客戶端應用程序(我猜想是「Preferences」窗口)知道在這個端口上監聽的東西是你的主應用程序,還是隻發生在其他地方的東西,所以你必須做某種握手和實施衝突解決機制
  • 對於未來的你或者任何維護你的應用程序的人來說,這都不會是顯而易見的。這看起來似乎並不重要,但在Socket 5574上進行通信似乎並不像在org.yourorganisation.someapp頻道上進行通信那樣簡潔。
  • 防火牆(如我認爲有人已經說了)可有點過分熱心

此外,這是值得讓你的手在DBUS - 這是有用的有一大堆的其他應用,如通信


你可以讀了一點彈出通知的事情,你會在最近Ubuntu的發行版,或某些即時通訊客戶端發現,等什麼我談論(也許糾正我的一些事情,我已經說過了)在這裏:http://www.freedesktop.org/wiki/Software/dbus。看起來他們正在努力讓它在Windows上發生,這很好。