我有一些代码尝试并行执行操作。
代码基本上是
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)没有运气。
不确定接下来要尝试什么。
答案 0 :(得分:0)
items
IEnumerable
?
如果是这样,您可能会遇到分区不佳的问题。尝试将项目包装(或传递)为IList<T>
或仅List<T>
。
答案 1 :(得分:0)
物品是在运行还是懒惰地构建/计算的? 也许项目的(顺序)来源不能足够快地提供它们以使并行性有利可图。