Ускоряет ли создание делегата распараллеливание?
От: Passerby  
Дата: 01.05.20 19:28
Оценка:
В цикле for вызывается одна и та же функция с разными параметрами.
for (int i = 0; i < 100; i++)
{
AnyMetod(0);
AnyMetod(1);
AnyMetod(2);
AnyMetod(3);
}

Хочется распараллелить.
for (int i = 0; i < 100; i++)
{
Parallel.Invoke(
()=>AnyMetod(0),
()=>AnyMetod(1),
()=>AnyMetod(2),
()=>AnyMetod(3)
);
}

Т.к. при исполнении кода ()=>AnyMetod(i) создается делегат, которому передается параметр, то имеет ли смысл чтобы каждый раз не создавался этот делегат, создать его самому?

delegate void Dg(int i);
Dg dg0 = AnyMetod;Dg dg1 = AnyMetod;Dg dg2 = AnyMetod;Dg dg3 = AnyMetod;
for (int i = 0; i < 100; i++)
{
Parallel.Invoke(
() => dg0(0),
() => dg1(1),
() => dg2(2),
() => dg3(3)
);
}

Мне казалось, что в таком случае должно быть ускорения, за счет того, что каждый раз в цикле не создается делегат. Но как-то написал простенький тест, который показал, что никакого увеличения производительности нет. Что-то тогда не так написал?

И еще тогда проверил, будет ли работать, если параллельно вызывать один и тот же делегат с разными параметрами:
delegate void Dg(int i);
Dg dg = AnyMetod;
for (int i = 0; i < 100; i++)
{
Parallel.Invoke(
() => dg(0),
() => dg(1),
() => dg(2),
() => dg(3)
);
}

У меня получилось, что нормально работает, хотя казалось бы т.к. делегат вызывается не последовательно, а параллельно, то из-за различных параметров должна происходить неразбериха. Почему работает? Чего-то тогда не так написал?
Отредактировано 01.05.2020 19:30 Passerby . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.