这不是我第一次遇到这个问题。
通过查看Java Mission Control中的Flight Recorder记录来优化我的Scala / Java代码。查看最热门的方法,然后是内存分配,最终应用程序运行速度提高50倍,或者快3倍。
一旦达到这一点,CPU使用率为60-90%,内存使用量为最大4GB堆中的2GB。但我认为我可以提高速度。
特性:
代码看起来大致如此(伪代码):
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()
然后在另一个线程上迭代状态以最小化上下文切换吗?也许这就是减缓事情的原因?
这是正确的方法吗?我还不想将问题本身并行化。
答案 0 :(得分:0)
我会将阅读器并行化。
如果数据在磁盘上,您可以创建一个线程,以块的形式从磁盘读取数据,另一个线程处理它。顺便说一下,这是Java Mission Control 4如何读取录制文件。或者您可以像Java Mission Control 5那样使用RandomAccessFile,它从多个线程读取,然后将结果拼接在一起。