У меня есть большой список для просмотра (1 500 000 элементов), с каждым элементом я должен сделать очень маленькую проверку. Всего за 30 сек.
Загрузка ЦП при использовании Sequential составляет около 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