多线程应用程序性能

时间:2012-05-14 16:08:22

标签: java multithreading performance multicore

我的Java应用程序基本上是这样做的:

  • 从文件中读取nThread缓冲区(1 MB字节arryas)
  • 创建处理缓冲区的nThread线程
  • 等待线程处理数据
  • 将处理后的数据写入另一个文件

这些应用程序中的一个应该为每个核心实现理论上100%的速度提升,但是,处理信息的线程越多,它就会获得SLOWER!

示例:

  • 1个主题:4800毫秒
  • 2个主题:10200毫秒
  • 3个主题:13400毫秒
  • 4个主题:18560 ms

2 个答案:

答案 0 :(得分:1)

在添加线程时获得这种性能意味着您正在做一些非常错误的事情。通常添加线程不会提供任何速度改进,有时可能会对你造成一些惩罚,但添加另一个线程并使程序运行时间加倍是非常不寻常的。

以下是需要调查的一些事项:

  • 正如评论中提到的@Tudor,您应该从单个线程读取输入文件,然后将工作分派给工作线程。
  • 您应该考虑使用ExecutorService而不是自己管理自己的主题。这通常会删除大量用户代码和相关的错误。见Executors.newFixedThreadPool(numThread)
  • 你确定你的线程正确吗?您应该致电new Thread(...).start()而不是直接致电run()
  • 您是否在开始下一个主题之前调用join() ?您应该start()所有线程,将线路分配给它们,然后在末尾join()
  • 您是否偶然将所有输入线发送到所有线程?我不认为这会显示性能数字,除非你增加输出IO。

如果您在问题中向我们展示了一些线程代码,我们可以提供更多帮助。

答案 1 :(得分:0)

未经充分优化的代码通常会耗尽整个内存带宽。在多核处理器上使用相同的未优化代码添加另一个线程,它们将在它们之间分配带宽,此外,相当频繁地相互碰撞,进一步降低了速度。

格雷说:“......程序运行时间加倍是非常不寻常的。”我不同意。这通常是在开始优化内存访问之前在C代码中发生的情况。我说从一开始就看不到减速是非常不寻常的。

我不知道Java是否有可用的采样,但这是一个显而易见的起点。