Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading PoshRsJob性能问题_Multithreading_Performance_Powershell - Fatal编程技术网

Multithreading PoshRsJob性能问题

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

为什么在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
我的目标是更快地构建对象,因为我有大约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