我的Java应用程序本质上是做这样的:多线程应用程序的性能
- 读nThread缓冲区从文件(1 MB字节arryas)
- 创建处理缓冲区
- 等待线程来处理数据nThread线程
- 写入处理的数据到另一个文件
它是那些要达到一个应用中的一个理论上每个核心都有100%的速度提升,但相反,线程处理信息的速度越快,其获得的SLOWER就越快!
例如:
- 1螺纹:4800毫秒
- 2线程:10200毫秒
- 3个线程:13400毫秒
- 4线程:18560毫秒
- 等
我的Java应用程序本质上是做这样的:多线程应用程序的性能
它是那些要达到一个应用中的一个理论上每个核心都有100%的速度提升,但相反,线程处理信息的速度越快,其获得的SLOWER就越快!
例如:
在添加线程时获得这种性能意味着您正在做某件事真的错了。通常添加线程不会提供任何速度改进,有时可能会惩罚你一点,但添加另一个线程并使程序运行时间加倍是非常不寻常的。
这里有一些事情要调查:
ExecutorService
而不是自己管理自己的线程。这通常会删除大量的用户代码和相关的错误。见Executors.newFixedThreadPool(numThread)
。new Thread(...).start()
,而不是直接拨打run()
。join()
之前你开始你的下一个线程?你应该所有的线程start()
,发送线路给他们,然后join()
最后。如果您向我们展示您的问题中的一些线程代码,我们可以提供更多帮助。
是的,我正在用单个线程读取和写入文件。 – dosse91214
我试着重复使用相同的线程并创建新的线程,最小变化的顺序是<1ms – dosse91214
我使用的是.start(),但不是.join(),因为我如何管理线程,现在我将给出看看那个线程池,我会看看它是否有效。非常感谢 – dosse91214
没有经过充分优化的代码通常会占用整个内存带宽。在多核处理器上添加另一个使用相同未优化代码的线程,它们将分离它们之间的带宽,并且相当频繁地进入对方,进一步放慢速度。
格雷说:“...加倍程序运行时间是非常不寻常的。”我不同意。这通常是在开始优化内存访问之前在C代码中发生的。我认为从一开始就没有看到减速是非常不寻常的。
我不知道抽样是否适用于Java,但这是一个明显的起点。
你是否正在用多线程读取文件? – Tudor
您是否创建了很多新线程或重新使用它们? – Stephan
你能告诉我们一个小代码样本:你是如何创建你的线程并发送线条给他们的? – Gray