多线程应用程序未达到处理器使用率的100%

时间:2012-04-14 02:22:15

标签: c# multithreading performance parallel-processing

我的多线程应用程序从HD中获取一些文件,然后处理这些文件中的数据。我重用了同一个类的实例(dataProcessing)来创建线程(我只是改变了调用方法的参数)。

processingThread [i] = new Thread(new ThreadStart(dataProcessing.parseAll));

我想知道原因是否可能是从同一内存读取的所有线程。

处理每个文件大约需要半分钟。这些文件很快就会被读取,因为它们只有200 KB。处理完文件后,我将所有结果写入一个目标文件中。我不认为问题是读取或写入磁盘。所有线程都在处理任务,但由于某种原因,处理器没有被完全使用。我尝试添加更多的线程,看看我是否可以达到100%的处理器使用率,但它会降低速度并减少处理使用量,而不是完全使用它。任何人都知道什么可能是错的?

1 个答案:

答案 0 :(得分:0)

您可能需要考虑以下几点:

  1. 今天大多数CPU都是超线程的。即使操作系统假设每个超线程核心都有2条管道,但情况并非如此,并且非常依赖于CPU和您正在执行的算术运算。虽然在大多数CPU上,每个管道上有2个整数单元,但只有一个FP,因此大多数FP操作都没有从超线程架构中获得任何装备。

  2. 由于文件只有200k,我只能假设它全部被复制到缓存中,所以这不是内存/磁盘问题。

  3. 您使用的是外部DLL吗?某些操作,如使用本机Bitmap类读取/保存JPEG文件,不是并行的,如果您一次执行多次执行,则不会看到任何加速。

  4. 当您达到线程之间切换的成本高于他们正在进行的操作时,性能会下降。

  5. 您只是在阅读数据还是在修改数据?如果每个线程也修改数据,则缓存上有许多锁。每个线程最好在自己的内存中收集自己的数据,并且只有在所有线程完成工作后才将所有数据组合在一起。