爲什麼在PowerShell中使用多線程非常慢,令人難以置信。我做錯了什麼?我正在使用PoshRsJob模塊。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
測試中輸入大小有多大?另外,可能包含'TotalSeconds'結果作爲參考 –
輸入大小是一個包含10.000個對象的數組。區別在於: RSJobs: 106,0617351秒 標準foreach: 0,3592102秒 – CaspervanDoorn
看起來像RSJobs代碼是不完整的(並非所有的變量都考慮在內)等等。你能提供一個MVCE(https://stackoverflow.com/help/mcve)嗎?與此同時,我注意到PostRsJobs的博客強調你不應該將'Start-RSJob'放在foreach循環中,否則你將會爲循環中的每個項目組裝新的運行空間池。 –