Multithreading PoshRsJob性能问题
为什么在PowerShell中使用多线程速度如此之慢令人难以置信。我做错什么了吗?我正在使用PoshRsJob模块 RSJobs:Multithreading PoshRsJob性能问题,multithreading,performance,powershell,Multithreading,Performance,Powershell,为什么在PowerShell中使用多线程速度如此之慢令人难以置信。我做错什么了吗?我正在使用PoshRsJob模块 RSJobs: (Measure-Command { $output = Start-RSJob -InputObject $shortDump -ScriptBlock { Param($out, $shortDump) $retObj = [pscustomobject]@{ UserMail = $_.Mai
(Measure-Command {
$output = Start-RSJob -InputObject $shortDump -ScriptBlock {
Param($out, $shortDump)
$retObj = [pscustomobject]@{
UserMail = $_.Mail
Type = $_.Type
}
# return $retObj
$retObj
} | Wait-RSJob
$out.Add( $( Get-RSJob | Receive-RSJob) )
# $out += $( Get-RSJob | Receive-RSJob )
}).TotalSeconds
及
标准的foreach
(Measure-Command {
foreach ($obj in $shortDump) {
$retObj = [pscustomobject]@{
UserMail =$obj.Mail
Type = $obj.Type
}
# $out+= $retObj
$out.Add($retObj)
}
}).TotalSeconds
我的目标是更快地构建对象,因为我有大约300000个对象要构建
编辑:这里是另一个例子。太慢了
快速的
慢得可怕
创建新的运行空间会增加开销。因此,对于许多小作业,您每次都会增加开销
(measure-command {[pscustomobject]@{'a'='b'}}).totalmilliseconds
0.1773
{start-rsjob -scriptblock {[pscustomobject]@{'a'='b'}}}).totalmilliseconds
93.0173
然后,将所有从单个作业返回的数据检索到一个对象中会增加更多的开销,这基本上是您最初的目标
基本上,从100000个对象构建1个对象,而不是创建100000次运行空间,每次创建1个对象,然后返回所有这些对象,从100000个对象构建1个对象
我不知道在这个应用程序中如何使用运行空间来提高效率。如果有一个昂贵的计算来确定每个对象,然后你只做了几个运行空间,并在每个运行空间中运行了数组的一个子集,也许吧 测试中的输入大小有多大?另外,可能包括TotalSeconds
结果以供参考输入大小是一个包含10.000个对象的数组。区别在于:RSJobs:1060617351秒标准foreach:03592102秒RSJobs代码不完整(并非所有变量都被考虑在内,等等)。您能提供一个MVCE()吗?同时,我注意到PostRsJobs的博客强调,您不应该将Start RSJob
放入foreach循环中,否则您将有为循环中的每个项目组装新运行空间池的开销。我在foreach循环中把Start RSJob放在哪里了?PowerShell版本:5.1 PoshRsJob版本:1.7.3.9“如果有一个昂贵的计算来确定每个对象,然后你只做了几个运行空间,并在每个运行空间中运行了数组的子集,也许。”我理解。是的,在创建新对象之前,必须有很多条件为真。我会检查这个。谢谢(度量命令{start rsjob-scriptblock{[pscustomobject]@{a'='b'}).最后一个问题:有没有其他解决方案可以在不使用作业或运行空间的情况下在powershell中更快地创建对象。@CaspervanDoorn运行空间是我所知道的开销最低的并行化方法。还有工作流,但我不认为并行化是你的灵丹妙药……运行空间不是对象crea尽管如此,[pscustomobject]
与新对象
或选择对象
相比是最有效的。
$out = New-Object System.Collections.ArrayList
$Test = `"RSJobs"`
"RSJobs"
$ScriptBlock = {
[pscustomobject]@{
UserMail = 'test'
Type = 'test2'
Test = $Using:Test
}
}
(Measure-Command {
1..100000 | Start-RSJob -Name {$_} -ScriptBlock $ScriptBlock
$out.Add( $( Get-RSJob | Receive-RSJob) )
}).TotalSeconds
(measure-command {[pscustomobject]@{'a'='b'}}).totalmilliseconds
0.1773
{start-rsjob -scriptblock {[pscustomobject]@{'a'='b'}}}).totalmilliseconds
93.0173