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#.
На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.