Обработка массива потоками - C#

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

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

здравствуйте, подскажите пожалуйста, почему обработка массивов в потоке медленнее, чем последовательная обработка. Прошу пожалуйста, гляньте код, может я в чем-то ошиблась. Для параллельной обработки массив разбивается на диапазоны равные кол-ву потоков.
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Diagnostics;
  5. using System.Net;
  6. using System.Threading.Tasks;
  7. using System.Threading;
  8. namespace ConsoleApplication1
  9. {
  10. internal class Program
  11. {
  12. // заполнение массива СВ
  13. private static double[] GetDoubleArr(int size)
  14. {
  15. var result = new double[size];
  16. var j1 = 1.01;
  17. var j2 = 0.01;
  18. for (var i = 0; i < size; i++)
  19. {
  20. result[i] = j1 +j2 ;
  21. j1++;
  22. j2=j2+0.01;
  23. }
  24. return result;
  25. }
  26. // возведение в степень
  27. private static void PrlArr(double[] a, int threadcount)
  28. {
  29. var b = new double [100000];
  30. int k = a.Length/threadcount;
  31. int kInc = a.Length % threadcount;
  32. Thread[] th = new Thread[threadcount];
  33.  
  34. // делим массив
  35. int i1 = 0;
  36. for (int i = 0; i < threadcount; i++)
  37. {
  38. int i2, i3;
  39. if (i < kInc)
  40. {
  41. i2 = i1;
  42. i3 = i1 + k + 1;
  43. i1 += k + 1;
  44. }
  45. else
  46. {
  47. i2 = i1;
  48. i3 = i1 + k;
  49. i1 += k;
  50. }
  51.  
  52. th[i] = new Thread((obj) =>
  53. {
  54. for (int j = i2; j < i3; j++)
  55. {
  56. b[j] = Math.Pow(a[j], 1.789);
  57. }
  58. });
  59. th[i].Start();
  60. }
  61. for (int i = 0; i < threadcount; i++)
  62. {
  63. th[i].Join();
  64. }
  65. }
  66. // возведение в степень
  67. private static void PowerArr(double[] a)
  68. {
  69. double[] b = new double[a.Length];
  70. for (var i = 0; i < a.Length; i++)
  71. {
  72. b[i] = Math.Pow(a[i], 1.789);
  73.  
  74. }
  75. }
  76. private static void PowerArrK(double[] a, int koef)
  77. {
  78. double[] b = new double[a.Length];
  79. for (var i = 0; i < a.Length; i++)
  80. {
  81. for (var j = 0; j < koef; j++)
  82. { b[i] = Math.Pow(a[i], 1.789);
  83. }
  84. }
  85. }
  86. private static void Main(string[] args)
  87. {
  88. int[] n = {10, 100, 1000, 100000};
  89. int[] m = {2, 3, 4, 5, 10};
  90. // стоим векторы, заполняя значениями
  91. List<double[]> A = n.Select(t => GetDoubleArr(t)).ToList();
  92. // последовательная обработка
  93. Console.Write("Введите кол-во прогонов вычисляемой функции - ");
  94. // кол-во прогонов вычисляемой функции
  95. int avg = Convert.ToInt32(Console.ReadLine());
  96. Console.Write("Введите параметр сложности - ");
  97. // кол-во прогонов вычисляемой функции
  98. int k = Convert.ToInt32(Console.ReadLine());
  99. // холостой запуск
  100. PrlArr(A[0], m[0]);
  101. PowerArrK(A[0], k);
  102. PowerArr(A[0]);
  103. Console.WriteLine("================================================================");
  104. Console.WriteLine("Последовательная обработка - простая ");
  105. Stopwatch sw = new Stopwatch();
  106. TimeSpan ts;
  107. for (var i = 0; i < n.Length; i++)
  108. {
  109. Console.WriteLine("Кол-во элементов в массиве - {0}", n[i]);
  110. sw.Restart();
  111. for (var j = 0; j < avg; j++)
  112. {
  113. PowerArr(A[i]);
  114. }
  115. sw.Stop();
  116. ts = sw.Elapsed;
  117. Console.WriteLine("Общее время: {0} миллисекунд", ts.TotalMilliseconds);
  118. }
  119. Console.WriteLine("================================================================");
  120. Console.WriteLine("Последовательная обработка - усложненная ");
  121. for (var i = 0; i < n.Length; i++)
  122. {
  123. Console.WriteLine("Кол-во элементов = {0}", n[i]);
  124. sw.Restart();
  125. for (var j = 0; j < avg; j++)
  126. {
  127. PowerArrK(A[i], k);
  128. }
  129. sw.Stop();
  130. ts = sw.Elapsed;
  131. Console.WriteLine("Общее время: {0} миллисекунд", ts.TotalMilliseconds / avg);
  132. }
  133. Console.WriteLine("================================================================");
  134. Console.WriteLine("Параллельная обработка - простая ");
  135. // цикл по потокам
  136. for (var i = 0; i < n.Length; i++)
  137. {
  138. Console.WriteLine("Кол-во элементов = {0}", n[i]);
  139. for (var l = 0; l < m.Length; l++)
  140. {
  141. Console.Write("Кол-во потоков - {0}. ", m[l]);
  142. //sw = Stopwatch.StartNew();
  143. // цикл для поиска ср. времени
  144. sw.Restart();
  145. for (var j = 0; j < avg; j++)
  146. {
  147.  
  148. PrlArr(A[i], m[l]);
  149. }
  150. sw.Stop();
  151. ts = sw.Elapsed;
  152. Console.WriteLine("Общее время: {0} миллисекунд", ts.TotalMilliseconds / avg);
  153. }
  154. }
  155. Console.ReadKey();
  156. }
  157. }
  158. }

Решение задачи: «Обработка массива потоками»

textual
Листинг программы
  1.             int threads = 5;
  2.             Parallel.For(0, threads, thread =>
  3.             {
  4.                 while (thread < a.Length)
  5.                 {
  6.                     a[thread] = Math.Pow(a[thread], 1.789);
  7.                     thread += threads;
  8.                 }
  9.             });

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


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

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

7   голосов , оценка 3.714 из 5

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

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

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