2010-05-23 4 views
16

필자는 PLinq가 더 비싼 것으로 판명되면 PLinq가 자동으로 비 병렬 Linq를 사용할 것이라고 읽었습니다. 그래서 나는 PLAINq을 모든 경우에 (가능한 경우) 사용하지 말고 런타임에서 사용할 PLinq를 선택하게하는 이유를 알게되었습니다.모든 Linq 쿼리에서 Plinq를 사용하는 것이 좋습니까?

애플 리케이션이 멀티 코어 서버에 배치 될 것이므로 병렬 처리를위한 코드를 조금 더 개발할 수 있습니다.

기본 설정으로 plinq를 사용했을 때의 함정은 무엇입니까?

답변

9

하나의 피트가 떨어지면 세트에서 주문을 활용할 수있는 능력을 잃게됩니다.

다음 코드를 보자

var results = new int { 0 ,1 ,2 ,3 }; 
var doSomethingSpecial = (from r in results.AsParallel() select r/2).ToArray(); 

당신은 결과가 집합의 순열이 될 수있는 결과 있도록 위해 오는 셀 수 없다. 이것은 가장 큰 함정 중 하나입니다. 주문 데이터를 다루는 경우에는 정렬 비용으로 인해 성능상의 이점을 잃을 수 있습니다.

또 다른 문제는 알려진 예외를 포착 할 수 없게된다는 것입니다. 그래서 널 포인터 예외를 잡을 수 없었습니다 (당신이 그렇게해야한다는 말은하지 않습니다) 또는 FormatException을 잡을 수도 있습니다.

모든 경우에 항상 Plinq을 사용하지 않아야하는 이유로 많은 이유가 있으며, 하나만 더 강조하겠습니다. "병렬이 아닌 Linq의 자동 사용"으로 uch를 읽지 마십시오. 쿼리가 단순한 배리어 케이스 만 처리하거나 병렬로 실행하기에는 너무 복잡합니다.

항상 PLINQ를 사용하면 서버에서 소비하는 리소스가 많아지며 실행중인 다른 스레드로부터 제거됩니다.

자료 :

MSDN PLNQ white paper

보장을 위해

Paul Kimmel on PLINQ

+2

을 주문 할 수있는 단지 AsOrdered() 당신은 분명이 추가 않기 때문에 당신이 당신의 알고리즘에 아무것도 얻을 수 있는지 확인하기 위해 측정해야하지만 간접비. 예외적으로 InnerException * s * 속성을 통해 발생한 개별 예외를 얻을 수있는 병렬 처리 실행에서 아무 것도 발생하면 AggregateException이 발생합니다. 모든 기술과 마찬가지로, 실제로 이점을 얻을 수 있는지를 확인하는 유일한 방법은 실제 세계에서 처리 할 대상을 나타내는 데이터 세트를 사용하여 실제로 측정하는 것입니다. –