PLinq по своей сути быстрее, чем System.Threading.Tasks.Parallel.ForEach

Резюме : Я изменил структуру 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 - это круто!)

Вопросы :

  1. Увеличивается ли скорость из-за использования plinq по сравнению с Parallel.ForEach?
  2. Вместо этого просто удаление параллельной структуры данных (ConcurrentDictionary) ? (Поскольку нет необходимости синхронизировать потоки.)
  3. На основании ответа на этот связанный вопрос

В то время как PLINQ в значительной степени основан на функциональном стиле программирования без побочных эффектов, побочные эффекты именно для чего предназначен TPL. Если вы действительно хотите работать параллельно, а не просто искать / выбирать что-то параллельно, вы используете TPL.

Могу ли я предположить, что, поскольку мой шаблон в основном функционален (предоставление входных данных дает новые выходные данные без мутации), то plinq какая технология использовать?

Я ищу подтверждение того, что мои предположения верны, или указание на то, что я что-то упускаю.

7
задан Community 23 May 2017 в 09:58
поделиться