【问题标题】:Concurrent program efficiency and CPU thread count并发程序效率和 CPU 线程数
【发布时间】:2011-03-25 11:47:04
【问题描述】:

大家好,我正在 Scala 中开发一个并发程序,我正在运行一些测试来检查效率,但我似乎得到了一些非常奇怪的数字。

在每次测试中,我都会增加“工人”或产生的进程的数量。我期望发现运行时间会增加,因为这些进程从 1 增加到通信开销和竞争条件变得足够高以将其取消的程度。因此,例如,我希望看到类似的内容:

进程 ------ 1 ------ 2 ------ 3 ------ 4 ------ 5 ------ 6 ---- -- 7

运行时间(秒)---- 3 ------- 2.5 ------- 2 ------- 1.5 ------- 2 ------ - 2.5 ------- 3

无论如何,我想问的是,是否有人知道英特尔酷睿 i5-430M 处理器可以容纳多少线程。我知道它通常具有编辑:2 个内核和 4 个线程。这是否意味着在产生 5 个或更多进程后性能应该开始变差?和上面的例子一样吗?

任何帮助将不胜感激。

【问题讨论】:

  • 我与参与者的并发基准测试显示了一个奇怪的行为(当然没有其他进程使用 CPU):与使用 6 个内核上的 6 个线程相比,使用 6 个线程仅产生 4%(应该是 20%)的性能5个线程。但是 5 个线程 22%(应该是 25%)与 4 个线程相比。与 2 个线程相比,4 个线程 85%(应该是 100%)。

标签: multithreading scala concurrency cpu


【解决方案1】:

使用 Runtime.getRuntime().availableProcessors()。通常对于 CPU 密集型应用程序,使用比可用内核/CPU 数量更多的线程没有任何好处。但是,如果某些线程在 IO 操作中阻塞,您可以从拥有更多线程中受益。

请注意,您应该尽可能使用 java.util.concurrent 库,而不是编写自己的并行化/并发代码。

【讨论】:

  • Runtime.getRuntime().availableProcessors() 这会做什么?我不确定。我还在 Scala 中制作了一个巨大的并发程序,所以我正在为它实现所有细节。
  • 它告诉您平台中有多少内核可用。对于 CPU 密集型应用程序,创建比此数量更多的线程没有意义。但是,您应该改用 java.util.concurrent,因为它会自动为您完成所有这些工作。
  • 哦,是的,这真的很有用,谢谢! :) 我仍然不确定您希望我如何使用 java.util.concurrent。我的意思是它是一个完整的班级,你是什么意思使用它?使用什么和做什么?
  • 看看java.util.concurrent.Executor 和实现类。这些就是你想做的工作。
【解决方案2】:

http://ark.intel.com/Product.aspx?id=43537

Intel 的这个规范说核心数是 2,线程数是 4。

【讨论】:

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