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




