Во-первых, я запускаю это на двухъядерном процессоре процессора 2,66 ГГц. Я не уверен, есть ли у меня вызов .AsParallel() в правильном месте. Я тоже пробовал его непосредственно в переменной диапазона, и это было еще медленнее. Я не понимаю, почему ...Почему PLINQ медленнее LINQ для этого кода?
Вот мои результаты:
Процесс непараллельный 1000 приняли 146 миллисекунды
процесс параллельной 1000 принял 156 миллисекунды
процесса непараллельный 5000 принимали 5187 миллисекунды
процесс параллельной 5000 взял 5300 миллисекунды
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
namespace DemoConsoleApp
{
internal class Program
{
private static void Main()
{
ReportOnTimedProcess(
() => GetIntegerCombinations(),
"non-parallel 1000");
ReportOnTimedProcess(
() => GetIntegerCombinations(runAsParallel: true),
"parallel 1000");
ReportOnTimedProcess(
() => GetIntegerCombinations(5000),
"non-parallel 5000");
ReportOnTimedProcess(
() => GetIntegerCombinations(5000, true),
"parallel 5000");
Console.Read();
}
private static List<Tuple<int, int>> GetIntegerCombinations(
int iterationCount = 1000, bool runAsParallel = false)
{
IEnumerable<int> range = Enumerable.Range(1, iterationCount);
IEnumerable<Tuple<int, int>> integerCombinations =
from x in range
from y in range
select new Tuple<int, int>(x, y);
return runAsParallel
? integerCombinations.AsParallel().ToList()
: integerCombinations.ToList();
}
private static void ReportOnTimedProcess(
Action process, string processName)
{
var stopwatch = new Stopwatch();
stopwatch.Start();
process();
stopwatch.Stop();
Console.WriteLine("Process {0} took {1} milliseconds",
processName, stopwatch.ElapsedMilliseconds);
}
}
}
Код в моем примере фактически создаст 25 миллионов комбинаций кортежей, когда количество итераций будет установлено в 5000 (5000 * 5000). Я думаю, что я вижу, что каждая логическая итерация слишком мала, чтобы распараллеливать в любом случае. Благодаря! –