3

두 솔루션 모두 200 개의 파일을 복사하려고했지만 차이점을 보지 못했습니다 (시간을 측정하기 위해 System.Diagnostics.Stopwatch을 사용했습니다). 두 경우 모두 8 초가 걸렸습니다. 두 번째 (병렬) 솔루션이 더 빠르지 않아야합니까? Parallel을 사용하는 IO 작업은 복사본 속도를 높이기 때문에 생각했습니다.파일을 병렬로 복사하고 병렬로 복사하지 않아도되는지 여부

내가 무엇이 누락 되었습니까?

// Case1 - Regular iteration 
foreach (FileInfo file in files) 
{ 
    string temppath = Path.Combine(destDirName, file.Name); 
    file.CopyTo(temppath, false); 
} 

// Case2 - Parallel 
Parallel.ForEach(files, file => 
{ 
    string temppath = Path.Combine(destDirName, file.Name); 
    file.CopyTo(temppath, false); 
}); 
+3

실제로 디스크 IO를 병렬화하면 ** 느려질 가능성이 높아집니다 **. 동시에 두 개의 파일을 복사 할 때 디스크는 두 파일 (즉 완전히 다른 위치)에서 읽어야합니다. 디스크를 하나씩 복사 할 때 디스크가 다른 영역을 많이 읽지 않아도 각 파일을 완전히 읽을 수 있습니다. – ThiefMaster

+0

대기 시간이 긴 네트워크 드라이브로 시도해 볼 흥미로운시기 일 수 있습니다. –

+0

및 풀에서 구성 가능한 수의 스레드가 사용됩니다. –

답변

5

병렬 실행으로 성능이 향상되는 것은 아닙니다.

귀하의 경우 파일 복사는 CPU 바운드가 아닌 IO 바운드가 될 수 있습니다. CPU는 일반적으로 IO 장치보다 훨씬 더 많은 대역폭을 사용할 수 있습니다 (퓨전 IO 카드 등을 사용하지 않는 한) IO 작업으로 인해 CPU가 많이 대기하게됩니다.

성능 향상을 위해 많은 CPU를 사용하는 작업을 병렬로 수행 할 수 있습니다. 외부 요인을 기다리는 작업도 차단 작업이되지 않도록 다른 스레드로 이동하면 도움이됩니다.

그러나 동일한 외부 리소스를 기다리고있는 작업은 외부 리소스가 여러 스레드와 관련된 트래픽을 처리 할 수있는 경우가 거의 없습니다 (IO는 결코 트래픽을 처리 할 수없는 경향이 있으며 실제로 경쟁을 일으킬 수 있음) 리소스가 느려짐). 당신이 기회를 얻을 경우

, 당신은 하나 또는 두 개의 네트워크 드라이브 이것을 시도하는 것 같아서 : 위 @ 아담이 아니라, 추가 된 점을

+0

위와 같이 네트워크 드라이브 또는 2 개의 네트워크 드라이브를 사용해 보았습니다. –

0

정확히 같은. 대기 시간이 긴 연결의 파일 전송은 설치 대기 시간이 길어 다중 스레드 솔루션에 이점을 줄 수 있습니다. 특히 많은 수의 작은 파일을 사용하는 경우 더욱 그렇습니다.

작은 수의 고정 된 스레드 (2 개의 말)를 가진 풀을 사용하여 디스크 경합을 줄이고 성능을 향상시키는 지 확인하는 것도 유용 할 수 있습니다.

내 대답이 마음에 드시면 upvote @ Adam, 나 아니세요.

+0

네트워크 드라이브가 로컬 드라이브와 같지 않습니다. 결국 네트워크 드라이브이지만 동일한 드라이브 (동일한 리소스)에 기록됩니다. 내가 맞습니까? – theateist

관련 문제