PowerShell并行与顺序作业 - 顺序更快?

时间:2013-11-03 17:00:01

标签: powershell

我正在尝试实现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的详细信息是:

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秒。

3 个答案:

答案 0 :(得分:2)

当您使用Powershell作业时,Powershell会创建一个新会话以运行脚本块。

试试这个:

measure-command { start-job -ScriptBlock {} }

创建工作需要花费多少时间。如果您正在使用该作业的任务花费的时间少于此,那么您最好只在本地会话中按顺序运行任务。

答案 1 :(得分:1)

对于您创建的每个作业,都会创建一个新的PowerShell进程,该进程需要资源进行调度,加载.net运行时等。它会产生大量的CPU开销,每个作业需要最少20mb +内存。

因此,工作更适合:

  • 持续数分钟或数小时的长时间运行的脚本。

  • 在多台计算机上以并行方式运行代码。

答案 2 :(得分:0)

支持Thomas Lee在http://tfl09.blogspot.com/2010/12/powershell-jobs.html

中已经说过的内容的进一步文档

“每次运行PowerShell作业时(无论是在ISE还是控制台中),PowerShell都会创建一个PowerShell.exe实例来执行脚本或脚本块。这意味着每个作业都会带来一些开销 - 创建流程有CPU / IO /内存要求。但是如果你可以在不同的进程中运行多个任务,那么使用Window的多处理功能,作业并行运行,因此整体时间要短得多。至少在理论上是这样!

一如既往。如果正在执行的任务使用很多或资源来实际执行,那么并行运行多个任务会提高资源利用率。具体来说,通过一个或两个“重”任务,您可以发现系统正在大量分页。实际上,这种分页可能最终会将执行速度降低到可以通过分页成本扫除并行化优势的程度。“