Резюме : Я изменил структуру System.Threading.Tasks.Parallel.ForEach и параллельных данных на простой запрос plinq (Parallel Linq). Скорость была поразительной .
Так действительно ли plinq быстрее, чем Parallel.ForEach? Или это относится к конкретной задаче.
// Original Code
// concurrent dictionary to store results
var resultDict = new ConcurrentDictionary();
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 мс, выполняя примерно ту же работу, только разными методами. (Вау, linq и plinq - это круто!)
Вопросы :
В то время как PLINQ в значительной степени основан на функциональном стиле программирования без побочных эффектов, побочные эффекты именно для чего предназначен TPL. Если вы действительно хотите работать параллельно, а не просто искать / выбирать что-то параллельно, вы используете TPL.
Могу ли я предположить, что, поскольку мой шаблон в основном функционален (предоставление входных данных дает новые выходные данные без мутации), то plinq какая технология использовать?
Я ищу подтверждение того, что мои предположения верны, или указание на то, что я что-то упускаю.