2010-02-16 3 views
18

ParallelEnumerable에는 정적 멤버 AsParallel이 있습니다. IEnumerable<T>이 있고 Parallel.ForEach을 사용하고 싶다면 항상 내가 AsParallel을 사용해야 함을 의미합니까?Parallel.ForEach에는 AsParallel()이 필요합니까?

둘 다 맞습니까? AsParallel없이

:

List<string> list = new List<string>(); 
Parallel.ForEach<string>(GetFileList().Where(file => reader.Match(file)), f => list.Add(f)); 

또는 AsParallel

?

List<string> list = new List<string>(); 
Parallel.ForEach<string>(GetFileList().Where(file => reader.Match(file)).AsParallel(), f => list.Add(f)); 

답변

21

무엇이 호출되는지에 따라 달라 지므로 별개의 문제입니다.

.AsParallel() 작업의 위임이 아닌 열거 형을 병렬 처리합니다.

Parallel.ForEach루프을 병렬 처리하여 각 요소에 대해 작업자 스레드에 작업을 할당합니다.

소스 열거 형이 평행하지 않으면 (예 : reader.Match(file)은 비쌉니다) 동일합니다. 마지막 질문에 두 가지 모두 맞습니다. 또한

, 당신이 여전히 PLINQ의 최대 이익을 얻고, 그것을 조금 단축을보고 할 수 있습니다 다른 하나 명의 구조있다 :

GetFileList().Where(file => reader.Match(file)).ForAll(f => list.Add(f)); 
+2

흠은 ... 정확히 열거를 parrallelizing되어가? 또는 적어도 병렬 처리가 작업 위임과 어떻게 분리 될 수 있습니까? – dkackman

+2

@dkackman'.AsParallel()'은 병렬 실행에 대한 수치를 제공합니다. 특히이 경우'.SelectMany()'의 병렬 버전을 사용합니다. 엄청난'Where' 절이 있지만 순서는없는 열거 형을 생각해 볼 때, 가능한 한 많은 코어에서 where 절을 동시에 사용하여 다음 사용 가능한 스레드에 대한 열거를 제공하여 거의 'n'배 빠릅니다. 그 결과로 우리가 한 일은 나중에 동일한 방식으로 처리 될 수 있습니다. 하나의 스레드에서 동 기적으로 또는 코어를 통해 사용 가능한만큼 확산 될 수 있습니다. 즉, Parallel.ForEach 또는'.ForAll' 부분이 의미가 있습니까? –

+0

그건 의미가 있습니다. 고마워, 닉. – dkackman