2010-04-10 62 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上发生,这很好。