0

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

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

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

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

4

1 回答 1

0

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

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

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

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

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

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

于 2012-04-15T15:14:10.817 回答