Windows EventLog のマルチスレッド解析を実装しようとしていますが、デュアル コア システムでは、順次コードが並列コードよりもはるかに高速であることがわかりました。これらは例です:
一連の:
$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."
平行:
$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."
順次コードは ~5 秒 (CPU 使用率が 50% 近く) で実行されるのに対し、並列コードは ~19 秒 (CPU 使用率が 100% 近く) で実行されます。結果をエコーして、両方が正しく、問題ないように見えることを確認しました。
Windows 8 を実行しています。PowerShell の詳細は次のとおりです。
名前 値 ---- ----- PSバージョン3.0 WSManStack バージョン 3.0 シリアル化バージョン 1.1.0.1 CLR バージョン 4.0.30319.18051 ビルドバージョン 6.2.9200.16628 PSCompatibleVersions {1.0、2.0、3.0} PSRemotingProtocolバージョン 2.2
何か案は?
編集: この難問を生み出すのは Get-WinEvent だけではありません。同じ結果で Get-ChildItem を試しました。
ただし、これを実行するコードとして使用すると、並列コードはより速く実行されます (予想どおり)。
$code1 = { Start-Sleep -Seconds 5; "A" }
$code2 = { Start-Sleep -Seconds 12; "B" }
シーケンシャルで 17.002 秒。並列で14.2秒。