【问题标题】:Considerations when using more threads than hardware threads?使用比硬件线程更多的线程时的注意事项?
【发布时间】:2011-09-24 00:12:34
【问题描述】:

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

在阅读了有关线程的文章后,我意识到我对如何编写最有效的代码存在一些困惑。

我有大约 200 个表,每个表大约有 40,000 条记录。我计划将每个表整体拉入java程序内的多维数组中,并针对该数组运行模拟。

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

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

【问题讨论】:

    标签: java multithreading


    【解决方案1】:

    我会研究Thread Pools,因为它们可能有助于解决限制并发线程数量的基本愿望。

    根据我的经验(在 Windows 中),更多线程(大约是核心线程的 2 倍)允许具有独立 CPU 绑定线程的代码运行得更快:也就是说,程序可以窃取更多优先级系统可能会给予其他进程;-) 设置线程优先级也会有所帮助,当然,IO 绑定线程是完全不同的故事。

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

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

    结果可能令人惊讶,并且受到许多因素的影响,包括但不限于 JVM/OS、算法、线程争用和用户空间占空比(IO 操作最终在内核领域)。还要记住,程序的不同部分可能会做出完全不同的反应,甚至可能对某些部分进行线程化(例如读取初始数据)甚至没有意义,具体取决于瓶颈具体化的位置和 -不可忽视——程序的复杂性。

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

    快乐的多线程编码。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        答案是确定的“视情况而定”。拥有比您的硬件支持更多的线程可能会加快您的程序。例如,假设您有 1 个线程持有数据库 I/O 锁,而其他 7 个线程等待它完成。同时让更多线程做其他工作肯定会加快这个程序的速度。

        由于您的程序似乎要与数据库交互进行大量 I/O,并且在收集数据后会进行大量 CPU 密集型工作,因此您可能会发现拥有 8 个以上的线程会使您的程序运行得更快.

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-19
          • 1970-01-01
          • 2011-08-01
          相关资源
          最近更新 更多