我有一个大列表要遍历(1.500.000 个项目),每个项目我都必须做一个非常小的检查。总共在 30 秒内。
使用 Sequential 时的 CPU 利用率约为 10%,因此有很多资源未使用。
第一个想法是使用Parallel,但是由于每个项目的持续时间有限,Parallel持续时间比顺序Foreach长,这是由于“为什么在这个例子中并行版本比顺序版本慢? ”,这解释了每个任务的创建都将花费时间。
所以我有另一个想法,那就是将列表分成 4 个(或更多)相等的和平,并创建一个线程来循环遍历项目以使其更快。
在创建自己的课程之前,这是一个好方法吗?或者关于如何加快速度的任何其他想法?或者您是否知道更好的处理方法。
代码
我为另一种并行方法创建的代码:(在我自己的静态类中使用)
public static void ForEach<T>(IEnumerable<T> list, Action<T> body, int listDevide)
{
// Number of items
int items = list.Count();
// Divided (in int, so floored)
int listPart = items / listDevide;
// Get numbers extra for last run
int rest = items % listDevide;
// List to save the actions
var actions = new List<Action>();
for(var x = 0; x < listDevide; x++)
{
// Create the actions
actions.Add(delegate {
foreach(var item in list.Skip(x * listPart).Take(listPart))
{
body.Invoke(item);
}
});
}
// Run the actions parallel
Parallel.Invoke(actions.ToArray());
}
备注:此示例中当前未使用“rest”变量来执行最后一项。
下面的解决方案,更多信息:http: //msdn.microsoft.com/en-us/library/dd997411.aspx