2012-05-14 193 views
2

我的Java应用程序本质上是做这样的:多线程应用程序的性能

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

它是那些要达到一个应用中的一个理论上每个核心都有100%的速度提升,但相反,线程处理信息的速度越快,其获得的SLOWER就越快!

例如:

  • 1螺纹:4800毫秒
  • 2线程:10200毫秒
  • 3个线程:13400毫秒
  • 4线程:18560毫秒
+3

你是否正在用多线程读取文件? – Tudor

+0

您是否创建了很多新线程或重新使用它们? – Stephan

+1

你能告诉我们一个小代码样本:你是如何创建你的线程并发送线条给他们的? – Gray

回答

1

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

这里有一些事情要调查:

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

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

+0

是的,我正在用单个线程读取和写入文件。 – dosse91214

+0

我试着重复使用相同的线程并创建新的线程,最小变化的顺序是<1ms – dosse91214

+0

我使用的是.start(),但不是.join(),因为我如何管理线程,现在我将给出看看那个线程池,我会看看它是否有效。非常感谢 – dosse91214

0

没有经过充分优化的代码通常会占用整个内存带宽。在多核处理器上添加另一个使用相同未优化代码的线程,它们将分离它们之间的带宽,并且相当频繁地进入对方,进一步放慢速度。

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

我不知道抽样是否适用于Java,但这是一个明显的起点。