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

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

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

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

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

textual
Листинг программы
public void SearchMaxNumWithTask()
        {
            var task = Task.Factory.StartNew(() =>
            {
                const int taskCount = 4;
                for (int i = 0; i < taskCount; i++)
                {
                    Task.Factory.StartNew(() =>
                    {
                        for (int j = i; j < numbers.Length; j += taskCount)
                            if (maxNum < Math.Abs(numbers[j]))
                                maxNum = Math.Abs(numbers[j]);
                    });
                }
            });
 
            Task.WaitAll(task);
        }

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


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

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

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