Task Parallel нестабилен, время от времени использует 100% CPU
В настоящее время я тестирую Parallel для C #. Как правило, он работает нормально, и использование параллельного интерфейса выполняется быстрее, чем обычные циклы foreach. Тем не менее, время от времени (например, 1 из 5), мой процессор будет использовать 100%, в результате чего параллельные задачи будут очень медленными. Моя установка CPU - i5-4570 с оперативной памятью 8 ГБ. У кого-нибудь есть идеи, почему возникает эта проблема?
Ниже приведены коды, которые я использовал для проверки функции
// Using normal foreach
ConcurrentBag<int> resultData = new ConcurrentBag<int>();
Stopwatch sw = new Stopwatch();
sw.Start();
foreach (var item in testData)
{
if (item.Equals(1))
{
resultData.Add(item);
}
}
Console.WriteLine("Normal ForEach " + sw.ElapsedMilliseconds);
// Using list parallel for
resultData = new ConcurrentBag<int>();
sw.Restart();
System.Threading.Tasks.Parallel.For(0, testData.Count() - 1, (i, loopState) =>
{
int data = testData[i];
if (data.Equals(1))
{
resultData.Add(data);
}
});
Console.WriteLine("List Parallel For " + sw.ElapsedMilliseconds);
// Using list parallel foreach
//resultData.Clear();
resultData = new ConcurrentBag<int>();
sw.Restart();
System.Threading.Tasks.Parallel.ForEach(testData, (item, loopState) =>
{
if (item.Equals(1))
{
resultData.Add(item);
}
});
Console.WriteLine("List Parallel ForEach " + sw.ElapsedMilliseconds);
// Using concurrent parallel for
ConcurrentStack<int> resultData2 = new ConcurrentStack<int>();
sw.Restart();
System.Threading.Tasks.Parallel.For(0, testData.Count() - 1, (i, loopState) =>
{
int data = testData[i];
if (data.Equals(1))
{
resultData2.Push(data);
}
});
Console.WriteLine("Concurrent Parallel For " + sw.ElapsedMilliseconds);
// Using concurrent parallel foreach
resultData2.Clear();
sw.Restart();
System.Threading.Tasks.Parallel.ForEach(testData, (item, loopState) =>
{
if (item.Equals(1))
{
resultData2.Push(item);
}
});
Console.WriteLine("Concurrent Parallel ForEach " + sw.ElapsedMilliseconds);
Нормальный выходНормальный ForEach 493
Параллельный список для 315
Параллельный список ForEach 328
Параллельная параллель для 286
Параллельная параллельная ForEach 292
При 100% загрузке процессораНормальный ForEach 476
Список параллельный для 8047
Параллельный список ForEach 276
Параллельная параллель для 281
Параллельная параллельная ForEach 3960
(Это может произойти во время любой из параллельных задач, выше только один случай)
ОбновитьПри использовании метода PLINQ, предоставляемого @willaien, и его 100-кратном запуске, эта проблема больше не возникает. Я до сих пор не знаю, почему эта проблема возникнет в первую очередь.
var resultData3 = testData.AsParallel().Where(x => x == 1).ToList();