Windows EventLogs의 다중 스레드 구문 분석을 구현하려고하는데 이중 코어 시스템에서 순차 코드가 병렬 코드보다 훨씬 빠르다는 것을 알게되었습니다.PowerShell 병렬 대 순차 작업 - 순차가 더 빠릅니까?
연속 :
$start = Get-Date
$code1 = { Get-WinEvent -Path "D:\logs\hostname-security-20131003005914.evtx" -MaxEvents 200 }
$code2 = { Get-WinEvent -Path "D:\logs\hostname-security-20131003015906.evtx" -MaxEvents 200 }
$result1 = & $code1
$result2 = & $code2
$end = Get-Date
$timespan = $end - $start
$seconds = $timespan.TotalSeconds
Write-Host "This took me $seconds seconds in all."
병렬 : 다음은 예입니다 순차 코드는 반면 (에 가까운 50 %의 CPU 사용률로) ~ 오초에서 실행
$start = Get-Date
$code1 = { Get-WinEvent -Path "D:\logs\hostname-security-20131003005914.evtx" -MaxEvents 200 }
$code2 = { Get-WinEvent -Path "D:\logs\hostname-security-20131003015906.evtx" -MaxEvents 200 }
$job1 = Start-Job -ScriptBlock $code1
$job2 = Start-Job -ScriptBlock $code2
$alljobs = Wait-Job $job1, $job2
$result1, $result2 = Receive-Job $alljobs
$end = Get-Date
$timespan = $end - $start
$seconds = $timespan.TotalSeconds
Write-Host "This took me $seconds seconds in all."
병렬 코드는 ~ 19 초 (CPU 사용률 100 %에 가깝게)로 실행됩니다. 나는 그들 모두가 정확하고 괜찮아 보이는지 확인하기 위해 결과를 echo'd했습니다.
나는 윈도우 8 실행 해요 PowerShell을 세부 사항은 다음과 같습니다
Name Value ---- ----- PSVersion 3.0 WSManStackVersion 3.0 SerializationVersion 1.1.0.1 CLRVersion 4.0.30319.18051 BuildVersion 6.2.9200.16628 PSCompatibleVersions {1.0, 2.0, 3.0} PSRemotingProtocolVersion 2.2
어떤 아이디어?
편집 : 이 수수께끼를 생성하는 것은 단지 Get-WinEvent가 아닙니다. 나는 Get-ChildItem을 사용해 동일한 결과를 얻으려고 노력했다. (예상) 그러나 실행하는 코드와 이에
은 병렬 코드 빨리 실행 순차를위한$code1 = { Start-Sleep -Seconds 5; "A" }
$code2 = { Start-Sleep -Seconds 12; "B" }
17.002 초. 병렬로 14.2 초.
프로세스를 길게했지만 언급 된 바와 같이 여전히 직관적이지 않은 결과가 발생합니다 위의 설명에 대한 회신에 – Robin