Распараллеливание вычислений - C#
Формулировка задачи:
Доброго времени.
Может кто-нибудь подсказать по классу Parallel из TPL.
Я создал вычисление интеграла Sin(x) от 0 до Пи, а время почему-то не особо различается. Ведь при параллельном программировании время выполнения должно сокращаться.
Тогда в чем смысл этого распараллеливания, если результаты выполнения не особо отличаются?
static void Main(string[] args)
{
double integral_formula = 0;
int n = 1000000000;
Parallel.Invoke(() => Factorial(n));
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i <= n - 1; i++)
integral_formula += ((Math.PI / n) * Math.Sin(Math.PI * i / n));
sw.Stop();
Console.WriteLine("Время работы без Parallel = {0}", sw.Elapsed);
Console.WriteLine("Sin по формуле равен {0}", integral_formula);
Console.ReadKey();
}
static void Factorial(int x)
{
double integral_formula = 0;
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i <= x - 1; i++)
integral_formula += ((Math.PI / x) * Math.Sin(Math.PI * i / x));
sw.Stop();
Console.WriteLine("Время работы c Parallel = {0}", sw.Elapsed);
Console.WriteLine("Sin по формуле равен {0}", integral_formula);
}Решение задачи: «Распараллеливание вычислений»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using System.Collections.Concurrent;
namespace Parallel_Test {
class Program {
static void Main(string[] args) {
int x = 1000000000;
CycleFactorial(x);
ParallelEnumerableFactorial(x);
AsParallelFactorial(x);
PartitionerFactorial(x);
Console.ReadLine();
}
static void CycleFactorial(int x) {
double integral = 0;
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < x; i++) {
integral += ((Math.PI / x) * Math.Sin(Math.PI * i / x));
}
sw.Stop();
Console.WriteLine("With Simple Cycle(): {0}", sw.Elapsed);
Console.WriteLine("Resul is: {0}", integral);
Console.WriteLine();
}
static void ParallelEnumerableFactorial(int x) {
Stopwatch sw = new Stopwatch();
sw.Start();
double integral = ParallelEnumerable.Range(0, x - 1)
.Sum(i => ((Math.PI / x) * Math.Sin(Math.PI * i / x)));
sw.Stop();
Console.WriteLine("With ParallelEnumerable: {0}", sw.Elapsed);
Console.WriteLine("Resul is: {0}", integral);
Console.WriteLine();
}
static void AsParallelFactorial(int x) {
var arr = Enumerable.Range(0, x - 1);
Stopwatch sw = new Stopwatch();
sw.Start();
double integral = arr.AsParallel()
.WithDegreeOfParallelism(Environment.ProcessorCount)
.WithExecutionMode(ParallelExecutionMode.ForceParallelism)
.Sum(i => ((Math.PI / x) * Math.Sin(Math.PI * i / x)));
sw.Stop();
Console.WriteLine("With AsParallel(): {0}", sw.Elapsed);
Console.WriteLine("Resul is: {0}", integral);
Console.WriteLine();
}
static void PartitionerFactorial(int x) {
Stopwatch sw = new Stopwatch();
sw.Start();
double integral = Partitioner.Create(Enumerable.Range(0, x - 1))
.AsParallel()
.WithDegreeOfParallelism(Environment.ProcessorCount)
.WithExecutionMode(ParallelExecutionMode.ForceParallelism)
.Sum(i => ((Math.PI / x) * Math.Sin(Math.PI * i / x)));
Console.WriteLine("With Partitioner(): {0}", sw.Elapsed);
Console.WriteLine("Resul is: {0}", integral);
Console.WriteLine();
}
}
}