最大化Java应用程序(vanilla数据处理)性能

时间:2016-07-27 11:48:03

标签: java performance scala optimization jvm

这不是我第一次遇到这个问题。

通过查看Java Mission Control中的Flight Recorder记录来优化我的Scala / Java代码。查看最热门的方法,然后是内存分配,最终应用程序运行速度提高50倍,或者快3倍。

一旦达到这一点,CPU使用率为60-90%,内存使用量为最大4GB堆中的2GB。但我认为我可以提高速度。

特性:

  • 单线程处理,从文件系统读取单个文件。
  • 文件系统读取速度为1GB / s的顺序读取,但处理速度低至5MB / s(分支,状态机等)。
  • 尽可能减少垃圾收集。
  • 没有精美的库,只有纯粹的JVM代码。

代码看起来大致如此(伪代码):

for line in file // using an iterator which would call into a file
  result = process_line(line)
  state = state.process(result)
  if state.emits:
    println(state.result)

在一个应用程序中,我有以下最热门的方法:

scala.collection.immutable.HashMap$HashTrieMap.getO(Object, Int, Int)  6.75%
java.io.BufferedInputStream.read() 4.97% 

在另一个(这是我的头脑中):

(some sort of garbage collection process) 9%
...       7%

仍然值得优化这些吗?我尝试过,并且在更复杂的代码中获得的性能提升很少。

我下一步该去哪儿?

我应该考虑在一个线程上执行process_line()然后在另一个线程上迭代状态以最小化上下文切换吗?也许这就是减缓事情的原因?

这是正确的方法吗?我还不想将问题本身并行化。

1 个答案:

答案 0 :(得分:0)

我会将阅读器并行化。

如果数据在磁盘上,您可以创建一个线程,以块的形式从磁盘读取数据,另一个线程处理它。顺便说一下,这是Java Mission Control 4如何读取录制文件。或者您可以像Java Mission Control 5那样使用RandomAccessFile,它从多个线程读取,然后将结果拼接在一起。