我有一个对象列表,我必须对它们中的每一个进行一些详细说明,所有这些都在最短的时间内完成。
由于这些阐述是彼此独立的,我们决定与Parallel.ForEach
同时进行。
Parallel.ForEach(hugeObjectList,
new ParallelOptions { MaxDegreeOfParallelism = 50 },
obj => DoSomeWork(obj)
);
由于我在ParallelOptions.MaxDegreeOfParallelism
(例如50或100)上设置一个庞大的数字似乎是不合理的,我们怎样才能找到最佳数量的并行任务来处理这个列表呢?
Parallel.Foreach
是否在另一个核心上启动了DoSomeWork
? (所以,既然我们有4个核心,那么正确的并行度将是4?)
答案 0 :(得分:1)
答案 1 :(得分:1)
询问平台应该让你接近最佳状态(对于CPU绑定工作)。
new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount },
什么都不做是另一个非常好的选择,即
//new ParallelOptions { MaxDegreeOfParallelism = 50 },
修改
有很多关于数据库的io ......
这使MaxDegreeOfParallelism = 1
成为另一个非常好的候选人。或者也许是2。
您真正应该关注的是异步/等待和异步数据库调用。不是Parallel类。
答案 2 :(得分:0)
唯一可以确定的方法是测试它。更多线程不等于更好的性能,并且可能经常产生更差的性能。一些想法:
为单个线程设计算法,然后添加Parallel.For周围没有意义。您必须更改算法以利用多个线程,否则并行处理的好处将是次要的或负面的。
如果您正在通过网络连接读取磁盘或通过网络连接下载数据,服务器能够以获取数据的速度为您提供数据,您可能会发现生产者/消费者模式效果最佳。如果处理的计算成本很高,请使用许多消费者线程(我倾向于使用Num Cores - 2.一个用于UI,一个用于生产者)。如果计算成本不高,则无论您使用多少个消费者线程都无关紧要。
如果您从各种来源下载来自互联网的数据,并且服务器需要时间来响应,您应该启动相当多的线程(50-100并不疯狂)。这是因为线程只会坐在那里等待服务器响应。