1

이것이 가장 효율적인 방법으로 어떻게 달성 될 수 있는지 궁금합니다.LINQ를 효율적으로 병렬화하는 방법 예외 메서드

나는

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

또는 다른

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

또는 뭔가를 사용해야합니까?

근본적인 차이점은 누구나 설명 할 수 있습니까? 측정에서부터 두 번째 줄이 느린 것 같습니다. 이것에 대한 이유는 무엇입니까? 두 ParallelQuery<T> 동작으로 두 번째 옵션을 사용

+0

[당신의 말을 경구] (http://ericlippert.com/2012/12/17/performance-rant/)로 우리에게 왜 묻고 있습니까? (테스트 해보고 어느 것이 더 빠르다는 것을 알아 내라. 그리고 유즈 케이스의 경우 아직 충분히 빠르지 않다면 * 여기 * 예제 코드를 사용하여 여기로 와서 "너무 느리다. 빨리 할 수 ​​있을까?") –

+2

디버거가 연결되어 있지 않은 상태에서 릴리스 모드로 실행하면 여전히 속도가 느립니까? –

+0

두 개의 쿼리가 동일하지 않습니다. 첫 번째 것은 두 개의 목록에서 작동하고 두 번째 목록은 세 번째 목록에서 작동합니다 (결과를 저장하기 위해 세 번째 목록이 필요하기 때문에 'a'에 할당하더라도 메모리에 임시 목록이 있습니다.) –

답변

4

는 병렬로 전체 동작을 수행한다 :

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

첫번째 옵션은 제거 순차 검사를 수행하고, 각각의 반복에 대한 ParallelQuery<T>를 구축해야한다 가능성이 훨씬 느립니다.

요소의 수에 따라, 그러나, 실제로 AsParallel없이 실행하는 것이 속도가 더 빠를 수 있습니다 : 많은 경우에

var results = a.Except(b); 

, 이익을 능가 작은 컬렉션에 대한 병렬화의 오버 헤드. 이 경우에 알 수있는 유일한 방법은 관련 옵션을 프로파일 링하고 측정하는 것입니다.

측정에서 두 번째 줄이 느린 것 같습니다. 이것에 대한 이유는 무엇입니까?

이것은 많은 요인 때문일 수 있습니다. 먼저 릴리스 빌드에서 VS 호스트 외부에서 실행 중인지 확인하십시오 (일반적인 문제입니다). 그렇지 않으면 콜렉션의 크기 및 관련된 데이터 유형이 원인 일 수 있습니다.

+0

나는 이것을 시도했지만 'b'가 병렬로 사용되지 않으면 예외가 throw됩니다. –

+0

@IgorSevo 입력 한대로 수정했습니다. –

관련 문제