Распараллеливание вычислений - 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();
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.2 из 5
Похожие ответы