Найти максимальное число по модулю. Сравнить производительность без потоков, с потоками, и задачей - C#

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

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

Собственно говоря дали задание написать тремя способами поиск максимального числа. А именно без использования потоков, с использованием потоков, и использованием задачи. А да, запретили использовать PLINQ и класс Parallel. Для начала создадим и заполним массив
Листинг программы
  1. int[] numbers = new int[10000000];
  2. Random rnd = new Random();
  3. for (int i = 0; i < numbers.Length; i++)
  4. numbers[i] = rnd.Next(int.MinValue + 1, int.MaxValue - 1);
Обычный поиск выглядит следующим образом
Листинг программы
  1. static int SearchMaxAbsNum(int[] numbers)
  2. {
  3. int max = Math.Abs(numbers[0]);
  4. for (int i = 0; i < numbers.Length; i++)
  5. if (max < Math.Abs(numbers[i]))
  6. max = Math.Abs(numbers[i]);
  7. return max;
  8. }
А вот с потоками вышла проблема. Есть идея создать массив потоков, и каждому назначить поиск макс элемента, правда возникают сложности с синхронизацией. Как "раздробить" наш массив на подзадачи, и сделать код потоко-безопасным.
Кстати говоря почему заполнение массива обычном способом будет медленнее чем параллельным
Листинг программы
  1. for (int i = 0; i < numbers.Length; i++)
  2. numbers[i] = rnd.Next(int.MinValue + 1, int.MaxValue - 1);
Параллельный способ
Листинг программы
  1. Parallel.For(
  2. 0,
  3. numbers.Length,
  4. i => numbers[i] = rnd.Next(int.MinValue + 1, int.MaxValue - 1)
  5. );
Stopwatch для первого показывает 0.61милисекунд, а для второго способа 0,8

Решение задачи: «Найти максимальное число по модулю. Сравнить производительность без потоков, с потоками, и задачей»

textual
Листинг программы
  1. public void SearchMaxNumWithTask()
  2.         {
  3.             var task = Task.Factory.StartNew(() =>
  4.             {
  5.                 const int taskCount = 4;
  6.                 for (int i = 0; i < taskCount; i++)
  7.                 {
  8.                     Task.Factory.StartNew(() =>
  9.                     {
  10.                         for (int j = i; j < numbers.Length; j += taskCount)
  11.                             if (maxNum < Math.Abs(numbers[j]))
  12.                                 maxNum = Math.Abs(numbers[j]);
  13.                     });
  14.                 }
  15.             });
  16.  
  17.             Task.WaitAll(task);
  18.         }

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


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

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

10   голосов , оценка 3.7 из 5

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

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

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