我正在尝试实现 Windows EventLogs 的多线程解析,并且在双核系统上我发现顺序代码比并行代码快得多。这些是示例:
顺序:
$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 WSManStackVersion 3.0 序列化版本 1.1.0.1 CLRVersion 4.0.30319.18051 构建版本 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 秒。