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

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

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

здравствуйте, подскажите пожалуйста, почему обработка массивов в потоке медленнее, чем последовательная обработка. Прошу пожалуйста, гляньте код, может я в чем-то ошиблась. Для параллельной обработки массив разбивается на диапазоны равные кол-ву потоков.
using System;
using System.Collections.Generic;
using System.Linq;
using  System.Diagnostics;
using System.Net;
using System.Threading.Tasks;
using System.Threading;
 
namespace ConsoleApplication1
{
    internal class Program
    {
        // заполнение массива СВ
        private static double[] GetDoubleArr(int size)
        {
            var result = new double[size];
            var j1 = 1.01;
            var j2 = 0.01;
                for (var i = 0; i < size; i++)
            {
                
                    result[i] = j1 +j2 ;
                    j1++;
                    j2=j2+0.01;
                
            }
            return result;
        }
 
        // возведение в степень
         private static void PrlArr(double[] a, int threadcount)
         {
             var b = new double [100000];
             int k = a.Length/threadcount;
             int kInc = a.Length % threadcount;
             Thread[] th = new Thread[threadcount];

            // делим массив
 
            int i1 = 0;
            for (int i = 0; i < threadcount; i++)
            {
                int i2, i3;
                if (i < kInc)
                {
                    i2 = i1;
                    i3 = i1 + k + 1;
                    i1 += k + 1;
                }
                else
                {
                    i2 = i1;
                    i3 = i1 + k;
                    i1 += k;
                }

                th[i] = new Thread((obj) =>
                {
                    
                        for (int j = i2; j < i3; j++)
                        {
                            b[j] = Math.Pow(a[j], 1.789);
 
                    }
                });
            
                     th[i].Start();
 
             }
 
             for (int i = 0; i < threadcount; i++)
             {
                th[i].Join();
             }
            
        }
 
        // возведение в степень
        private static void PowerArr(double[] a)
        {
 
            double[] b = new double[a.Length];
            for (var i = 0; i < a.Length; i++)
            {                               
                    b[i] = Math.Pow(a[i], 1.789);

            }
 
        }
        private static void PowerArrK(double[] a, int koef)
        {
         
            double[] b = new double[a.Length];
            for (var i = 0; i < a.Length; i++)
            {
                for (var j = 0; j < koef; j++) 
                { b[i] = Math.Pow(a[i], 1.789);
                    
                }
            }
           
         }
        
        private static void Main(string[] args)
        {
            int[] n = {10, 100, 1000, 100000};
            int[] m = {2, 3, 4, 5, 10};
                      
            // стоим векторы, заполняя  значениями 
            List<double[]> A = n.Select(t => GetDoubleArr(t)).ToList();
 
            // последовательная обработка
            Console.Write("Введите кол-во прогонов вычисляемой функции - ");
            // кол-во прогонов вычисляемой функции
            int avg = Convert.ToInt32(Console.ReadLine());
 
            Console.Write("Введите параметр сложности - ");
            // кол-во прогонов вычисляемой функции
            int k = Convert.ToInt32(Console.ReadLine());
 
            // холостой запуск
            PrlArr(A[0], m[0]);
            PowerArrK(A[0], k);
            PowerArr(A[0]);
           
            Console.WriteLine("================================================================");
            Console.WriteLine("Последовательная обработка - простая ");
            Stopwatch sw = new Stopwatch();
            TimeSpan ts;
            
            for (var i = 0; i < n.Length; i++)
            {
                Console.WriteLine("Кол-во элементов в массиве - {0}", n[i]);
                sw.Restart();
                for (var j = 0; j < avg; j++)
                {
                     PowerArr(A[i]);
                   
                }
                sw.Stop();
                ts = sw.Elapsed;
                Console.WriteLine("Общее время: {0} миллисекунд", ts.TotalMilliseconds);
            }
            Console.WriteLine("================================================================");
            Console.WriteLine("Последовательная обработка - усложненная ");
          
            for (var i = 0; i < n.Length; i++)
            {
                Console.WriteLine("Кол-во элементов = {0}", n[i]);
                sw.Restart();
                for (var j = 0; j < avg; j++)
                {
                    
                    PowerArrK(A[i], k);
              }
                sw.Stop();
                ts = sw.Elapsed;
               Console.WriteLine("Общее время: {0} миллисекунд", ts.TotalMilliseconds / avg);
            }
            Console.WriteLine("================================================================");
             Console.WriteLine("Параллельная обработка - простая ");
 
            // цикл по потокам
           
            for (var i = 0; i < n.Length; i++)
            {
                Console.WriteLine("Кол-во элементов = {0}", n[i]);
                
                for (var l = 0; l < m.Length; l++)
                {
                    Console.Write("Кол-во потоков - {0}. ", m[l]);
 
                    //sw = Stopwatch.StartNew();
                    // цикл для поиска ср. времени
                    sw.Restart();
                    for (var j = 0; j < avg; j++)
                    {

                        PrlArr(A[i], m[l]);
 
                   }
                    sw.Stop();
 
                    ts = sw.Elapsed;
                    Console.WriteLine("Общее время: {0} миллисекунд", ts.TotalMilliseconds / avg);
                }
             }
 
            Console.ReadKey();
        }
    }
}

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

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

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


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

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

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