【问题标题】:How can we optimize CPU bound Java applications?我们如何优化 CPU 密集型 Java 应用程序?
【发布时间】:2015-11-16 22:57:34
【问题描述】:

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

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

【问题讨论】:

  • 首先优化您(未发布的)代码中的关键路径。然后,寻找更好的算法。
  • 分析您的代码以分析其大部分时间花费在哪里。这可以指导您尝试优化哪些部分。
  • 配置内存使用和 GC 活动。有时,仅仅增加 VM 的堆大小就可以取得很大的成功。
  • 另见Amdahl's law。
  • 我也建议你使用 Flight Recorder 而不是 VisualVM。它更准确,而且它的 CPU 分析往往更好(因为它不使用仪器或 JMX)

标签: java micro-optimization genetic-programming


【解决方案1】:

由于您正在使用基因编程,因此您需要花费大量操作来执行以下一项(或多项)操作:

  • 计算下一代(交叉、变异)
  • 健身函数计算
  • 如果您的人口非常多,请收集垃圾

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

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

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

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

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

编辑:阅读 cmets,我发现您的代码没有并行化,您必须从它开始。这对 GP 来说是微不足道的,只需并行运行适应度,然后并行运行下一代计算。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多