C#中的多线程CPU使用率

时间:2012-04-24 06:31:28

标签: c# multithreading cpu-usage

我的程序使用预定数量的线程,每个线程都执行独立工作。 我使用i7-2600 CPU,但我关闭了超线程模块,因此它在4个内核上运行4个线程。 当我使用1个线程运行程序时,CPU使用率为25%,这是完美的,因为1个线程被完全使用,但是当我运行4或3个线程时,我只获得60%的CPU,为什么?

就像我之前提到的那样,线程是完全独立的(没有锁定也没有争用)当我用1个线程运行程序4次时,我获得了100%的CPU使用率(即当每个进程的4个进程为1个线程时)我得到适当的CPU使用率)

有什么想法吗?

更多信息:

  1. 在处理所有需要的数据时,我没有使用I / O加载到内存中,每个线程在处理之前加载自己的数据。
  2. 我从数据库加载数据(使用oleDb),但我正在描述的问题发生在加载后所有线程都在处理(没有加载完成)。
  3. 数字是:
    • 2个线程大约40%而不是50个(每个线程85%)。
    • 3个线程约50%而非75个(每个线程65%)。
    • 4个线程大约60%而不是100个(每个线程60%)。
  4. 我使用带有16GB内存的i7 2600,但该过程中的内存使用率并未接近。
  5. 我运行Windows性能监视器来查找没有的争用。

3 个答案:

答案 0 :(得分:3)

您可以尝试将程序从工作站转移到服务器垃圾回收模式。目前,您可以只使用一个垃圾收集线程 设置说明here 有关解释/更多详细信息,请参阅此thread 更改后不要指望100%的CPU负载,但是你会接近100%并增加它的速度。

答案 1 :(得分:1)

concurrency visualizer会帮助你。您将看到每个线程何时执行,如果所有线程都没有执行,您可以确切地看到特定线程正在等待的原因。如果生成大量垃圾,GC可能会阻止线程导致线性缩放。但你只能通过真正的调查找到答案。

答案 2 :(得分:1)

我在使用.NET Framework v2.0时遇到了同样的问题,然后我将项目目标框架更改为以100%CPU负载启动的v4.0

编辑:您可以使用

查看每个线程的CPU使用情况

Sysinternals Process Explorer

Process Hacker