为什么在PowerShell中使用多线程如此令人难以置信的慢。我做错了吗?我正在使用PoshRsJob模块。
RSJobs:
(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
我的目标是更快地构建对象,因为我有~300.000个对象要构建。
编辑:这是另一个例子。它完全很慢!
$out = New-Object System.Collections.ArrayList
"default"
(Measure-Command {
for ($x = 0; $x -lt 100000; $x++)
{
$retObj = [pscustomobject]@{
UserMail = 'test'
Type = 'test2'
Test = 'default'
}
$out.Add($retObj)
}
}).TotalSeconds
$out2 = $out
$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
答案 0 :(得分:0)
创建新的运行空间会产生开销。因此,对于许多小型工作,您每次都会增加开销。
(measure-command {[pscustomobject]@{'a'='b'}}).totalmilliseconds
0.1773
{start-rsjob -scriptblock {[pscustomobject]@{'a'='b'}}}).totalmilliseconds
93.0173
然后,您正在添加更多开销,将各个作业的所有返回数据检索到一个对象中,这基本上是您的目标。
基本上,从100,000个对象构建1个对象,每次创建一个运行空间100,000次创建1个对象,然后返回所有这些对象,从100,000个对象构建1个对象。
我不知道如何在此应用程序中使用运行空间获得任何效率提升。如果有一个昂贵的计算来确定每个对象,那么你只需要几个运行空间并在每个运行空间中运行一个子集,也许。