Как эффективно распараллелить метод 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 в сборке релиза (это распространенная проблема). В противном случае это может быть связано с размером коллекций и типами данных.