Сводка : я изменил структуру System.Threading.Tasks.Parallel.ForEach и Concurrent Data на простой запрос plinq (Parallel Linq). Скорость была удивительно .
Так что, по сути, plinq быстрее, чем Parallel.ForEach? Или это специфично для задачи.
// Original Code
// concurrent dictionary to store results
var resultDict = new ConcurrentDictionary<string, MyResultType>();
Parallel.ForEach(items, item =>
{
resultDict.TryAdd(item.Name, PerformWork(source));
});
// new code
var results =
items
.AsParallel()
.Select(item => new { item.Name, queryResult = PerformWork(item) })
.ToDictionary(kv => kv.SourceName, kv => kv.queryResult);
Примечания :
Каждая задача (PerformWork) теперь выполняется от 0 до 200 мс. Раньше это занимало больше времени, чем я оптимизировал его Вот почему я использовал библиотеку Tasks.Parallel в первую очередь. Таким образом, я перешел от общего времени 2 секунды к общему времени ~ 100-200 мс, выполняя примерно одну и ту же работу, только разными методами. (Ух ты, Линк и Плинк классные!)
Вопросы
- Ускорено ли использование plinq vs Parallel.ForEach?
- Является ли это просто удалением параллельной структуры данных (ConcurrentDictionary)? (Потому что не нужно синхронизировать потоки).
- На основании ответа на этот связанный вопрос
В то время как PLINQ в значительной степени основан на функциональном стиле программирования без побочных эффектов, побочные эффекты - это именно то, для чего предназначен TPL. Если вы действительно хотите работать параллельно, а не просто искать / выбирать вещи параллельно, используйте TPL.
Могу ли я предположить, что, поскольку мой шаблон в основном функционален (предоставление входов приводит к новым выходам без мутации), эта технология plinq является правильной для использования?
Я ищу подтверждение того, что мои предположения верны, или указание на то, что я что-то упустил.