PoshRsJob表现问题

时间:2017-06-12 09:07:54

标签: multithreading performance powershell

为什么在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

1 个答案:

答案 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个对象。

我不知道如何在此应用程序中使用运行空间获得任何效率提升。如果有一个昂贵的计算来确定每个对象,那么你只需要几个运行空间并在每个运行空间中运行一个子集,也许。