2015-11-16 14 views
1

我目前在遗传编程方面做了一些研究,并且我没有访问多台计算机(还),因此我可以执行聚合计算。目前,我的家用台式机上的研究只需要大约1.5小时,所以它不是难以忍受的,但随着分析变得更加先进,我预计数据的大小会有显着增加。我们如何优化CPU绑定的Java应用程序?

有什么方法可以优化Java在这些条件下处理器的使用?

+7

首先优化您的(未发布的)代码中的关键路径。然后,寻找更好的算法。 –

+4

分析您的代码以分析它大部分时间花在哪里。这可以指导您尝试优化哪些部分。 –

+1

配置文件内存使用和GC活动。有时只是增加虚拟机的堆大小可能是一个很大的胜利。 –

回答

0

既然你与遗传编程工作,你花很多操作执行下列操作之一(或多个):

  • 计算下一代(交叉,变异)
  • 健身功能计算
  • 垃圾收集,如果你的人口非常大

要确定你的代码的热点,使用JVisualVM,采样窗格将足够您的用例。

从我的经验,我认为主要有两个可能的热点:

  • 慢交叉和内存耗尽:这是关系到uncompact个人代表。您可以通过减少个人内存占用量来获得显着的性能。尝试尽可能将其放入原始数组中。
  • 慢速健身:这比较困难,您可能想要减少程序评估的次数,或者查看更多重要示例。

如果您使用的是固定大小的人群,那么您可能会考虑在堆外工作,但这可能会使程序显着复杂化。

我不知道你是否在使用像JGAP这样的框架,但是后者是致命的慢,太多的封装和大的调用堆栈。它对于概念证明是非常好的,但是当事情变得密集时,你必须自己去做。

编辑:阅读评论,我看到你的代码没有并行化,你必须绝对从头开始。这对于GP来说是微不足道的,只是平行运行适应度,然后平行进行下一代计算。

+1

甚至[*令人尴尬*平行](https://en.wikipedia.org/wiki/Embarrassingly_parallel):) –

相关问题