我目前正在基因编程方面进行一些研究,但我还无法访问多台计算机来执行聚合计算。目前,这项研究在我的家庭桌面上只需要大约 1.5 小时,所以这并不是难以忍受,但随着分析变得更加先进,我预计数据量将显着增加。
在这些条件下,我们可以通过哪些方法来优化 Java 对处理器的使用?
最佳答案
由于您正在研究遗传编程,因此您会花费大量操作来执行以下一项(或多项)操作:
- 计算下一代(交叉、变异)
- 适应度函数计算
- 如果您的人口众多,则进行垃圾收集
要确定代码的热点,请使用 JVisualVM,采样 Pane 足以满足您的用例。
根据我的经验,我认为有两个主要的可能热点:
- 缓慢的交叉和内存耗尽:这与不紧凑的个体表示有关。您可以通过减少个人的内存占用来获得显着的性能。尽可能尝试将其放入原始数组中。
- 适应度慢:这比较困难,您可能需要减少程序评估的次数,或者寻找更有意义的示例。
如果您正在处理固定大小的群体,您可以考虑在堆外工作,但这可能会大大增加您的程序的复杂性。
我不知道你是否使用像JGAP这样的框架,但后者速度慢得要命,封装太多,调用堆栈太大。这对于概念证明非常有用,但是当事情变得密集时,你必须自己做。
编辑:阅读评论,我发现您的代码没有并行化,您绝对必须从它开始。这对于 GP 来说很简单,只需并行运行适应度,然后并行运行下一代计算即可。
关于java - 我们如何优化 CPU 密集型 Java 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33746202/