Hej,
Pomijając sens tych dwóch funkcji, StartParallel wykonuje się ok 3 razy dłużej niż StartTask.
private const int RANGE = 10000000;
private static void StartParallel()
{
var numbers = Enumerable.Range(1, RANGE).ToList();
var copy = new BlockingCollection<int>();
Task.Run(() =>
{
Parallel.ForEach(numbers, (number) =>
{
copy.Add((int)(Math.Sqrt(number * Math.PI)));
});
copy.CompleteAdding();
}).Wait();
}
private static void StartTask()
{
var numbers = Enumerable.Range(1, RANGE).ToList();
var copy = new BlockingCollection<int>();
Task.Run(() =>
{
foreach(var number in numbers)
{
copy.Add((int)(Math.Sqrt(number * Math.PI)));
}
copy.CompleteAdding();
}).Wait();
}
Jak mówi strona Microsoft:
Data parallelism refers to scenarios in which the same operation is performed concurrently (that is, in parallel) on elements in a source collection or array. In data parallel operations, the source collection is partitioned so that multiple threads can operate on different segments concurrently.
Jeśli dobrze to rozumiem Parallel.Foreach dzieli dane z kolekcji na "kawałki" dzięki czemu wiele wątków może wykonywać na nich operację równocześnie.
Ktoś może w przystępny sposób wyjaśnić różnicę między tymi funkcjami, skąd wynika taka rozbieżność czasowa między nimi i kiedy powinno używać się danego rozwiązania?