2009-06-13 4 views
-1

정확하게 말했는지 모르겠지만 간단한 예를 들어 Point3 값의 집합 (예 : 1M)이 있다고 가정 해 봅시다.더 나은 멀티 스레딩 : 단일 함수 또는 컬렉션 함수

우리는 이러한 값에 다른 Point3 값을 추가하여 새로운 Point3 값을 반환하는 Offset이라는 메서드를 사용합니다. 방법이 정적이라고 가정 해 봅시다.

Point3 유형은 변경 불가능합니다.

public static Point3 Offset (Point3 a, Point3 b) 

또는

public static IEnumerable<Point3> Offset (IEnumerable<Point3> a, IEnumerable<Point3> b) 

나에게 # 1은 다른 스레드에 대해 별도의 작업으로 작업을 깨고 더 나은 선택처럼 보인다 :

문제는이 같은 방법을 가지고 있어야한다 .

당신은 어떻게 생각하십니까? # 1 또는 # 2의 장점은 무엇입니까?

+0

정확하게 멀티 스레딩이 게임에 도입되는 곳은 어디입니까? – chris166

+0

컬렉션에서 많은 수의 항목에 대한 작업을 appliy합니다. –

+0

열거자가 스레드로부터 안전 할 경우에만 두 번째 병렬 처리가 가능하기 때문에 물어 보았습니다. Avish의 답변도 참조하십시오. – chris166

답변

1

옵션 1은 논리적 코어 작업입니다. .NET 4.0을 사용하면 Zip 연산자를 사용하여 옵션 2와 동일한 작업을 수행 할 수 있습니다. 대신 메모리에서 :

var newPoints = Offset(firstPoints, secondPoints); 

당신은 쓸 것 :

var newPoints = firstPoints.Zip(secondPoints, (p1, p2) => Offset(p1, p2)); 

당신은 당신은뿐만 아니라 .NET 3.5을 사용하는 경우 Point3Offset 확장 방법을 고려할 수 있습니다. 당신이 Point3 유형을 제어하는 ​​경우 (또는,이 논리 또한 같은 소리 -. Zip에 호출 (p1, p2) => p1 + p2을 쓰는 것이 좋을 것이다

당신에 .NET 4.0하지만 Zip 항소를 사용하지 않는 경우, 우리 MoreLINQ에 구현이 있습니다. 매우 간단합니다.

지금까지 아무 것도 멀티 스레딩과 관련이 없었습니다. 이제는 .NET 4.0에 PLANQ 구현이 Zip인지 여부는 알 수 없지만 거기에 IMO가있는 것이 당연합니다.

+0

감사합니다. 나는 동의한다. 나는 또한 당신이 # 1 : var points = Parallel.Foreach (origPoints, Offset) 또는 이와 비슷한 것을 할 수 있다고 생각했다. TPL을 사용하지 않았으므로 전체 구문을 알지 못합니다. 하나의 옵셋 포인트 3을 사용하여 점 집합체에 대한 옵셋 연산을 병렬 처리하는 경우 어떻게 할 것입니까? –

+0

또한 맞습니다. 오프셋은 논리적으로 추가 된 것입니다. 나는 그들이 응용 프로그램에서 그것을 사용할 수있는 응용 프로그램의 사용자를위한 높은 수준의 이름을 만들고 있습니다. 높은 수준에서는 앱과의 통합 측면에서 + 연산자 이상을 제공합니다. –

+1

* single * 오프셋을 사용하는 것은 쉽습니다. Select를 사용하는 경우 일뿐입니다. PLINQ로 쉽게 병렬 처리 할 수 ​​있습니다. (고정 된 방법으로 한 시퀀스의 시퀀스를 다른 시퀀스에 투영하는 것입니다.) "다른 시퀀스에 의한 시퀀스를 오프셋"하는 것은 까다 롭습니다. –

2

아마도 첫 번째 전화를 가지고 두 번째 전화를해야합니다.

2

# 1이 더 간단하고 깨끗해 보입니다. 항상 외부에서 병렬 처리 할 수 ​​있습니다. 나는 당신이 중요한 세부 사항을 진술하는 것을 게을리하지 않는 한, # 2를 독점적으로 사용하는 이유를 보지 못한다. 같은 방식으로 이런 종류의 루프를 일상적으로 병렬 처리하기로 결정했다면 # 2 call # 1을 만드십시오.

1

내 대답은 둘 다입니다. 나는 simpiliest 함수를 사용하는 것을 좋아한다. 그래서 # 1이 좋다. 동시에리스트를 조작하는 편리한 메소드가 유용하기 때문에 적절한 경우 스레드를 생성하는 작업을 수행 할 수 있습니다.

Java (내 모든 언어가 있지만 Java는 충분히 잘 알고 있어야 함) 중 하나는 Java 기반의 쇠고기 중 하나입니다. 여전히 기본 라이브러리가 다중 스레드의 장점을 갖도록 만들지 않은 것입니다. 개발자는이를 지원하는 많은 메커니즘을 제공했습니다. "이 목록의 모든 요소에이 함수를 적용"하는 일반적인 함수가 있어야하며,이 함수는 사용 가능한 코어 수, 목록의 크기, 오버 헤드가 무엇인지 파악한 다음 적절하게 최적화해야합니다.