为什么AsParallel()。ForAll似乎没有完全利用我的操作的CPU使用?

时间:2016-09-17 01:00:24

标签: c# linq parallel-processing

我有一些代码尝试并行执行操作。

代码基本上是

    items
      .AsParallel()
      .ForAll(item =>
      {
          DoWork(item);
      });

Items是要处理的2500件事的列表。 DoWork()是100%CPU计算,完全没有IO。它需要大约1秒钟,但它可以在一定程度上变化。

我看到的问题是所有核心都在使用,但它们几乎没有被使用。我认为这与工作本身有关,所以我尝试了以下代码并得到了相同的结果。

    items
      .Batches(10)
      .AsParallel()
      .ForAll(batch =>
      {
          foreach(var item in batch)
          {
            DoWork(item);
          }
      });

我希望利用率接近80%,但对于我的生活,我无法在那里得到它。不知道该怎么做。

我试过没有运气的Parallel.ForEach。试过.WithDegreeOfParallelism(Environment.ProcessorCount * 2)没有运气。

不确定接下来要尝试什么。

CPU utilization

2 个答案:

答案 0 :(得分:0)

items IEnumerable? 如果是这样,您可能会遇到分区不佳的问题。尝试将项目包装(或传递)为IList<T>或仅List<T>

答案 1 :(得分:0)

物品是在运行还是懒惰地构建/计算的? 也许项目的(顺序)来源不能足够快地提供它们以使并行性有利可图。