Parallel C#

Parallel C#

Всем доброго времени суток. На связи Алексей Гулынин. В прошлой статье мы начали рассматривать параллельное программирование в C# с рассмотрения методов класса "Task". В библиотеке TPL есть ещё один полезный класс, помимо "Task" — это Parallel, у которого все методы статические. Данный класс позволяет распараллелить некоторые действия. Метод "Invoke()" позволяет запустить параллельное выполнение нескольких методов. Следующий пример является надуманным. Он нужен лишь для того, чтобы показать синтаксис:

// не забываем подключать System.Threading.Tasks;
// Распараллелим выполнение следующих 4 методов
public static void Add(double i, double j) { Console.WriteLine(i + j); }
public static void Mult(double i, double j) { Console.WriteLine(i * j); }
public static void Div(double i, double j) { if (j != 0) Console.WriteLine(i / j); else Console.WriteLine("Деление на 0!"); }
public static void Sub(double i, double j) { Console.WriteLine(i - j); }
static void Main(string[] args)
{
  Parallel.Invoke(
    () => Add(10,5),
    () => Mult(10,5),
    () => Div(10,5),
    () => Sub(10,5)
  );
  Console.ReadLine();
}

Также данный класс применяется, чтобы распараллелить действия в циклах, т.е. все итерации будут выполняться не последовательно, а параллельно. Есть статические методы "For()" и "ForEach()". Давайте приведем пример использования таких циклов. Будем складывать строки через обычную операцию конкатенации. Будем выполнять данное действие стандартным циклом, а затем распараллелим данный процесс. В конце сравним время:

static void Main(string[] args)
{
  long end = 100000;
  double[] massiv = new double[end + 1];
  {
    DateTime dt_start = DateTime.Now;
    string buf = "";
    // Используем стандартный цикл
    for (long i = 0; i <= end; i++)
    {
      buf += i.ToString();
    }
    Console.WriteLine((DateTime.Now - dt_start).Seconds.ToString());
    // У меня было 13 секунд
    Console.ReadLine();
   }
   {
     DateTime dt_start = DateTime.Now;
     string buf = "";
     // Используем стандартный цикл
     Parallel.For(0, end + 1, index => { buf += index; });
     // Здесь было 2 секунды
     Console.WriteLine((DateTime.Now - dt_start).Seconds.ToString());
     Console.ReadLine();
   }
}

В данном случае у нас имеется 100001 итерация. Мы не знаем, как будет происходить параллельное вычисление: параллельно будут складываться 100001 строк, или будет разбивка по группам. В этом и заключается высокоуровневая абстракция: не нужно думать о конкретных потоках и самим определять сколько потоков создавать. Всё на усмотрение библиотеки TPL.

Данный пример также является надуманным и опять же нацелен на то, чтобы показать синтаксис данного метода + показать, что параллельное выполнение требует меньшего количества времени.

В данной небольшой статье вы узнали про ещё один полезный класс библиотеки TPL — Parallel в C#.

На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.


Комментарии:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *