繁体   English   中英

使用多于硬件线程的注意事项?

[英]Considerations when using more threads than hardware threads?

我有一台全新的笔记本电脑,配备i7 2630qm CPU(4核,8线程),我很高兴能利用多核处理器的强大功能。

在阅读了有关线程的内容之后,我意识到我在如何编写最有效的代码方面存在一些困惑。

我有大约200张桌子,每张桌子都有大约40,000条记录。 我计划将每个表全部拉入java程序内的多维数组,并对该数组进行仿真。

显然,每个线程一个数组,但是我想知道的是: 同时创建所有(200)个线程,RAM允许还是编写仅在8个线程之间切换出数组的代码,我会从中得到任何好处吗?

我的意思是,据我了解,我的i7只有8个硬件线程。

我将研究线程池,因为它们可能有助于解决限制并发线程数的基本需求。

以我的经验(在Windows中),更多的线程(大约是核心线程的2倍)允许具有独立CPU绑定线程的代码运行得更快:也就是说,程序可以窃取操作系统可能赋予其他进程的更多优先级;-)线程优先级也可以提供帮助,当然,与IO绑定的线程是另一回事。

请记住,您的代码并非孤立运行,并且操作系统最终负责线程调度:

知道“确定”的唯一方法是尝试不同的事情并运行性能测试

结果可能令人惊讶,并且受许多因素影响,这些因素包括但不限于JVM / OS,算法,线程争用和用户空间占空比(IO操作最终出现在内核领域)。 另外请记住,程序的不同部分可能会完全不同地做出反应,甚至可能无法理解某些部分的线程化(例如读取初始数据),具体取决于瓶颈发生的位置和-不容忽视-程序复杂性。

(使用线程池可以轻松地调整允许的并发线程数,这是我建议这样做的原因之一。)

快乐的多线程编码。

您打算在每个线程中做什么—查询数据库或处理数据? 如果是前者,那么多个线程将无济于事,因为您将受到I / O约束。 如果是后者,仔细的设计确实可以使您使用多线程显着提高速度。

答案是肯定的“取决于”。 有更多的线程,然后您的硬件支持可能会加快您的程序。 例如,假设您有1个线程持有数据库I / O的锁,而其他7个线程正在等待它完成。 同时拥有更多线程来执行其他工作肯定会加快此程序的速度。

由于您的程序似乎通过数据库交互执行大量I / O,并且一旦收集到数据就需要大量CPU密集型工作,因此您可能会发现拥有8个以上的线程可以使程序运行更快。

正如其他人所建议的那样,可能需要进行一些反复试验。 祝好运。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM