java - 我们如何优化 CPU 密集型 Java 应用程序?

标签 java micro-optimization genetic-programming

我目前正在基因编程方面进行一些研究,但我还无法访问多台计算机来执行聚合计算。目前,这项研究在我的家庭桌面上只需要大约 1.5 小时,所以这并不是难以忍受,但随着分析变得更加先进,我预计数据量将显着增加。

在这些条件下,我们可以通过哪些方法来优化 Java 对处理器的使用?

最佳答案

由于您正在研究遗传编程,因此您会花费大量操作来执行以下一项(或多项)操作:

  • 计算下一代(交叉、变异)
  • 适应度函数计算
  • 如果您的人口众多,则进行垃圾收集

要确定代码的热点,请使用 JVisualVM,采样 Pane 足以满足您的用例。

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

  • 缓慢的交叉和内存耗尽:这与不紧凑的个体表示有关。您可以通过减少个人的内存占用来获得显着的性能。尽可能尝试将其放入原始数组中。
  • 适应度慢:这比较困难,您可能需要减少程序评估的次数,或者寻找更有意义的示例。

如果您正在处理固定大小的群体,您可以考虑在堆外工作,但这可能会大大增加您的程序的复杂性。

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

编辑:阅读评论,我发现您的代码没有并行化,您绝对必须从它开始。这对于 GP 来说很简单,只需并行运行适应度,然后并行运行下一代计算即可。

关于java - 我们如何优化 CPU 密集型 Java 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33746202/

相关文章:

java - 寻找最近的2点

Java将UTC时间转换为本地时间

c++ - 添加与比较

objective-c - objective-c 中的遗​​传编程 (GP) 实现?

java默认方法不起作用

java - 尝试在 Netbeans 中使用时出现 Glassfish 错误

php - 应该使用 `if ($a != NULL)` 还是 `if ($a !== NULL)` 来控制程序流?

java - 额外的 'if checks' 如果该值已经设置 - 什么更快,什么使用更多资源?

artificial-intelligence - Mandelbrot集的遗传编程