2012-08-27 4 views
2

WPF 응용 프로그램에서 작업 중입니다.
화면 /보기에서 WCF 서비스를 6 번 호출해야합니다. 이러한 통화 중 어떤 것도 데이터를 공유하지 않는다는 의미에서 관련이 없으며 서로 의존하지도 않습니다. TPL을 사용하여 6 가지 WCF 서비스 호출을 6 가지 작업으로 만들 계획입니다. 이제 응용 프로그램은 단일 코어 시스템 또는 다중 코어 시스템에 전개 될 수 있습니다.작업 병렬 라이브러리 - 단일 코어에 대한 병렬 처리

단일 코어 컴퓨터에서 TPL을 사용하면 실제로 다른 작업을 시간에 맞추기 위해 CPU 스케줄러에 발생하는 오버 헤드로 인해 작업 완료에 걸리는 시간이 증가한다고 들었습니다. 이것은 사실입니까. 그렇다면 계속 디자인을 계속해야하며 그렇지 않으면 대안을 찾아야합니다.

내가 대안을 살펴 봐야한다면, 그 대체 무엇입니까 :)?

+0

또 다른 가능성은 서비스를 비동기 적으로 호출하는 것입니다. 이것은 C# 5에서 특히 쉽습니다. – svick

답변

5

CPU를 집중적으로 사용하는 경우 단일 코어 시스템에서 병렬 스레드를 실행하여 오버 헤드를 추가 할 수 있습니다.

작업이 CPU를 많이 사용하지 않는 경우 서비스 호출이 응답하기를 기다리고 있으므로 단일 코어 시스템에서 병렬 스레드를 잘 실행할 수 있습니다.

서버가 호출을 처리하는 방법에 따라 어쨌든 시간이 증가하지 않을 수 있습니다. 전화가 서버에 대기 중이면 모든 통화를 실행하는 데 거의 같은 시간이 걸립니다. 이 경우 순차적으로 호출을 실행하는 것이 좋을 것입니다.

+0

CPU를 집중적으로 정의 할 수 있습니까? CPU가 디스크 헤더를 읽을 때까지 기다려야하기 때문에 파일 시스템 액세스가 CPu 집중적이라는 것을 알고 있습니다. 어떻게하면 CPU 집중적 인 작업을 식별합니까? –

+0

@HariSubramaniam : CPU 집약적 인 작업은 CPU 자체가 작업을 수행 할 때입니다. 무거운 계산. CPU가 디스크 드라이브가 작업을 완료하기를 기다리는 동안 대부분 유휴 상태이므로 디스크 액세스 대기는 CPU를 많이 사용하지 않습니다. – Guffa

1

일반적으로 단일 코어에서 다중 스레드를 실행하는 경우 스레드간에 컨텍스트 전환이 있으므로 속도가 느려집니다.

나는 다음과 같은 그림이 당신에게 차이를 설명 생각 : 당신이 그림은 싱글 코어, 멀티 태스킹 및 두 번째 시간 연속에서 처음으로 실행 4 개 스레드를 참조 볼 수 있듯이

Context Switch

.

멀티 태스킹에서 모든 스레드가 순차적 인 태스킹보다 나중에 완료됨을 알 수 있습니다. 아마에서 특정 경우

은 동일하지 않으며 나는 @Guffa이

3

가장 좋은 방법은 멀티 코어 및 싱글 코어를 사용하여 프로파일입니다 전화는 포함 WCF 이후 그의 대답에 권리라고 생각합니다. 대부분의 바이오스는 활성 코어의 수를 설정할 수 있으므로 큰 문제는 아닙니다. 모의 테스트를 통해 자신에게 적합한 지 여부를 확인할 수 있습니다.

분명히 작업 전환을 사용하면 오버 헤드 문제가 있지만 각 작업 시간이 설정 시간보다 훨씬 길면 알 수 없습니다.

멀티 태스킹 동작을 구현하는 데는 여러 가지 방법이 있으며 가장 잘 모르는 경우 실제로 테스트 사례를 작성하고 프로파일 링해야합니다. 이것은하기가 어렵지 않습니다. 멀티 코어 시스템을 사용하려는 경우 일반적으로 최신 버전의 .NET을 사용하는 것이 매우 쉽습니다. 또한 멀티 코어 용으로 설정할 수도 있지만 적절한 구성을 사용하여 단일 코어로 되돌릴 수 있습니다.

예를 들어 비동기/대기 패턴은 #ifdef을 사용하거나 검색 및 교체 도구로 모든 키워드 대기를 제거하여 쉽게 동기식으로 실행할 수 있습니다. Parallel.For 루프는 직접 for 루프로 직접 변환하거나 MaxDegreeOfParallelism을 변경하여 쉽게 변환 할 수 있습니다.작업을 동 기적으로 쉽게 실행할 수 있습니다.

투명성을 높이려면 T4와 같은 일부 사전 처리 스크립트를 사용할 수 있습니다.

관련 문제