2017-12-19 17 views
4

그래서 최신 버전인지 확인하는 1000 가지 항목이 있습니다. 이러한 항목 각각에는 수천 개의 파일을 읽어야합니다 (일부 항목은 여러 항목에서 동일한 파일 일 수 있음).Async/Await vs Parellel.For.이 경우 더 좋습니다.

현재이 파일은 TPL (async/await)을 사용하여 구현됩니다. 하나는 읽어야하는 파일 하나는 검사해야하는 각 항목에 하나입니다. 이것은 제 3의 가장 비싼 함수에 대한 프로파일 링을 제외하고는 잘 작동합니다. 스레드 풀에서 TrySteal입니다.

Visual Studio 동시성 뷰어를 사용하면 스레드 관련 시간대의 99 %가 동시에 관련 항목에 소비되고 실행시 1 % 만 소요된다는 것을 알 수 있습니다. 이것이 내가 너무 많은 작업을 생성하고 있다고 생각하게 만듭니다 (참고 : 어디서나 Task.Run을 사용하지 않고 기다리고 있습니다).

Parellel.Async/await를 사용하여 많은 파일을 읽는 것보다 오버 헤드가 적습니까? 태스크 프로그래밍 라이브러리를 사용하면 얼마나 많은 오버 헤드가 예상됩니까?

+0

디스크 하위 시스템의 성능 기능을 사용하고 있는지 확인하기 위해 리소스 모니터 (Windows 작업 관리자의 성능 탭에서 사용 가능)를 선택 했습니까? 그렇다면 문제를 재고해야 할 수도 있습니다. 데이터 캐싱, 여러 드라이브 사용, 적절한 RAID 세트 사용, SSD (s) .... – HABO

+0

아마 둘 다. 대신 _TPL DataFlow_를 고려할 수 있습니다. 각 블록의 메시지를 시간으로 입출력 작업의 수에 적합한 방식으로 제한 할 수 있습니다. – MickyD

+2

네 개의 하드웨어 급습 SSD가 있고 90 %의 파일이 메모리에 있으므로 이미 디스크가 전혀 tick. 거리지 않습니다. 그러나 CPU 사용량은 동시에 실행되는 모든 프로그램에서 100 %이므로 CPU 사용량을 줄여서 최적화하려고합니다. 작업 스케줄러는 큰 부분을 차지하는 것으로 나타났습니다. – user2460953

답변

2

하드 드라이브의 파일을 검사하는 경우이 작업이 매우 잘 병렬 처리되지 않는다고 생각합니다. 동시에 수천 개의 파일을 읽으 려한다면, 동시에 많은 파일을 읽을 수 없기 때문에 프로세스를 훨씬 느리게 만들뿐 아니라 메모리에 너무 많은 파일을 캐시 할 수 없기 때문에 프로세스를 훨씬 느리게 만듭니다. 검사 프로세스 자체의 최적화가없는 가장 빠른 옵션은 연속적으로 검사를 실행해야합니다. 정말로 최적화하고 싶다면 파일을 반복하면서 항목을 반복하면서 각 파일을 검사하는 대신 각 항목을 확인하는 것이 좋습니다. 이 경우 여러 스레드에서 수행하는 것조차도 효과적 일 수 있습니다 (한 번에 모든 스레드가 아닌 경우).

업데이트 : 모든 파일을 캐시하기에 충분한 메모리가있는 경우 다중 스레딩을 그다지 제한하지 않습니다. 여전히 병렬 스레드의 수를 숫자로 제한하는 것이 좋습니다. 작업 할 프로세서 코어의 양과 비교할 수 있습니다. Parallel.ForEach()로 처리하는 것이 좋습니다. 또한 Parallel.Foreach()는 루프가 비동기 적이므로 코드를 이해하기 쉽다고 분명하게 명시합니다.

+0

이 경우 대부분의 파일은 메모리에 저장됩니다 (메모리에 이미 저장되어있을 가능성이 큽니다). 파일이 메모리에 있어도 동일한 조언이 적용됩니까? 기억하기 때문에, 그들은 이전에 프로세스에 의해 사용 된 것처럼 아마 대기 목록에 있음을 의미합니다. – user2460953

+0

@ user2460953 아니요, 제 충고는 적용되지 않습니다. 나는 나의 대답을 업데이트했다. –

+0

동일한 파일에서 읽을 수있는 항목이 여러 개 있기 때문에 파일을 나타내는 객체의 병렬 for 루프 내에서 잠금을 수행해야한다고 가정합니다. 그런 식으로 두 항목이 같은 파일을 해시하기를 원한다면 하나는 승리하고 다른 하나는 잠금이 해결 된 후에 이미 해시 된 것으로 간주됩니다. – user2460953