Проблема производительности PLINQ - PullRequest
2 голосов
/ 29 января 2011

Я использую PLINQ для сбора более 10000 элементов ... я не получаю производительность по сравнению с последовательным запросом.

моя конфигурация системы выглядит следующим образом: ОС - Windows 7 32-разрядная, процессор -Intel Core2Duo.

Пожалуйста, помогите мне, я не получаю надлежащую производительность.

Запрос:

ParallelQuery<int> j = Enumerable.Range(0, 1000000).AsParallel();
var sss =  j.Where(o => o%2 == 0);

Ответы [ 2 ]

4 голосов
/ 29 января 2011

Поскольку ваши задачи очень легкие, значительные издержки будут вызваны переключением контекста потока.Вещи можно улучшить, сгруппировав легкие задачи в партии, которые потребуют более значительного объема работы.Это может быть достигнуто с помощью поддержки разбиения в PLinq.См. Следующий вопрос:

Пакетная обработка параллельных операций

Группируя задачи, вы будете более эффективно использовать несколько потоков, поскольку издержки на управление станут менее значительными.

В вашем существующем примере кода это похоже на получение воды из колодца с помощью наперстка, группировка задач больше похожа на использование ведра.

2 голосов
/ 29 января 2011

Даже если задача распределяется между потоками, слишком часто слишком часто могут быть вызваны издержки на вызов потоков, а не просто последовательное выполнение.

В этом случае вы выполняете несколько простых математических операций, поэтому каждая операция выполняется в <10nsec и очень хорошо использует кэш L1 и L2. Когда вы представляете потоки, они имеют относительно высокую стоимость запуска, частично из-за того, что они спят, ожидая чего-то сделать. </p>

Посмотрите на Пользовательские разделители для PLINQ и TPL .

...