Распараллеливание нахождения интеграла методом трапеций - C#

Узнай цену своей работы

Формулировка задачи:

сделал через PLINQ и через потоки, но через потоки уже час висит и никак, я думал вначале что реально просто так долго, но щас уже начал сомневаться, посмотрите пожалуйста, вроде все правильно, но почему же так долго...
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading;
  6. using System.Threading.Tasks;
  7. using System.Diagnostics;
  8. namespace lab1
  9. {
  10. class Program
  11. {
  12. static void Main(string[] args)
  13. {
  14. try
  15. {
  16. Console.Write("start end step: ");
  17. var values = Console.ReadLine().Split(' ').Select(double.Parse).ToArray();
  18. var start = values[0];
  19. var end = values[1];
  20. var step = values[2];
  21. Func<double, double> function = x => Math.Exp(-x);
  22. var stopwatch = new Stopwatch();
  23. stopwatch.Start();
  24. var result = TheMethodOfTrapezoidsSequential(function, start, end, step);
  25. stopwatch.Stop();
  26. Console.WriteLine($"[sequential] result: {result}; time: {stopwatch.ElapsedMilliseconds}");
  27. stopwatch.Restart();
  28. var steps = TheMethodOfTrapezoidsSteps(function, start, end, step);
  29. var stepsParallel = steps.AsParallel().WithExecutionMode(ParallelExecutionMode.ForceParallelism)
  30. .WithDegreeOfParallelism(Environment.ProcessorCount);
  31. result = stepsParallel.Sum();
  32. stopwatch.Stop();
  33. Console.WriteLine($"[PLINQ parallel] result: {result}; time: {stopwatch.ElapsedMilliseconds}");
  34. stopwatch.Restart();
  35. result = TheMethodOfTrapezoidsParallel(function, start, end, step);
  36. stopwatch.Stop();
  37. Console.WriteLine($"[multi-threading parallel] result: {result}; time: {stopwatch.ElapsedMilliseconds}");
  38. }
  39. catch (Exception e)
  40. {
  41. Console.Write(e.Message);
  42. }
  43. Console.ReadKey();
  44. }
  45. public static double TheMethodOfTrapezoids(Func<double, double> function, double x, double step)
  46. {
  47. return (function(x) + function(x + step)) * step / 2;
  48. }
  49. public static double TheMethodOfTrapezoidsSequential(Func<double, double> function, double start, double end, double step)
  50. {
  51. var result = 0.0;
  52. for (double x = start; x <= end; x += step)
  53. result += TheMethodOfTrapezoids(function, x, step);
  54. return result;
  55. }
  56. public static IEnumerable<double> TheMethodOfTrapezoidsSteps(Func<double, double> function, double start, double end, double step)
  57. {
  58. for (double x = start; x <= end; x += step)
  59. yield return TheMethodOfTrapezoids(function, x, step);
  60. }
  61. public static double TheMethodOfTrapezoidsParallel(Func<double, double> function, double start, double end, double step)
  62. {
  63. var count = 0;
  64. var steps = new List<double>();
  65. ParameterizedThreadStart threadHandler = obj =>
  66. {
  67. var x = (double)obj;
  68. var r = TheMethodOfTrapezoids(function, x, step);
  69. steps.Add(r);
  70. };
  71. for (double x = start; x <= end; x += step, count++)
  72. new Thread(threadHandler).Start(x);
  73. while (steps.Count != count) ;
  74. return steps.Sum();
  75. }
  76. }
  77. }

Решение задачи: «Распараллеливание нахождения интеграла методом трапеций»

textual
Листинг программы
  1.         public static double TheMethodOfTrapezoidsParallel(Func<double, double> function, double start, double end, double step)
  2.         {
  3.             var count = 0;
  4.             var steps = new List<double>();
  5.  
  6.             List<Task> tasks = new List<Task>();
  7.  
  8.             for (double x = start; x <= end; x += step, count++)
  9.             {
  10.                 tasks.Add(Task.Run(() =>
  11.                     {
  12.                         var r = TheMethodOfTrapezoids(function, x, step);
  13.                         lock (steps)
  14.                         {
  15.                             steps.Add(r);
  16.                         }
  17.                     }));
  18.             }
  19.  
  20.             Task.WaitAll(tasks.ToArray());
  21.  
  22.             return steps.Sum();
  23.         }

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


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

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

15   голосов , оценка 4.2 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы