Как эффективно распараллелить метод LINQ Except

Мне было интересно, как это может быть достигнуто наиболее эффективным способом.

Должен ли я использовать

a.RemoveAll(x => b.AsParallel().Any(y => y == x));

или же

a.AsParallel().Except(b.AsParallel());

или что-то другое?

Кто-нибудь может объяснить, в чем заключается основная разница? Из измерения мне кажется, что вторая строка медленнее. Что является причиной этого?

1 ответ

Решение

Используя второй вариант, с двумя ParallelQuery<T> операции, будем выполнять всю операцию параллельно:

var results = a.AsParallel().Except(b.AsParallel());

Первый вариант выполняет последовательную проверку удаления и должен создать ParallelQuery<T> для каждой итерации, которая, вероятно, будет намного медленнее.

Однако, в зависимости от количества элементов, это может быть быстрее AsParallel:

var results = a.Except(b);

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

Из измерения мне кажется, что вторая строка медленнее. Что является причиной этого?

Это может быть связано с множеством факторов. Во-первых, убедитесь, что вы работаете вне хоста VS в сборке релиза (это распространенная проблема). В противном случае это может быть связано с размером коллекций и типами данных.

Другие вопросы по тегам