2012-05-13 51 views
7

當我執行一個簡單的語句本地爲什麼Powershell Jobs這麼慢?

$path = 'C:\Windows\System32\WindowsPowerShell\v1.0' 
gci $path 

我馬上查看響應。但是當我在本地機器上執行它作爲工作時

$start = get-date 
$path = 'C:\Windows\System32\WindowsPowerShell\v1.0' 
$cmd = [scriptblock]::Create("gci $path") 
$jnr1 = Invoke-Command -computer localhost -ScriptBlock $cmd -asJob 
Wait-Job $jnr1 
Receive-job $jnr1 
$end = Get-date 
($end - $start).totalseconds 

我必須等待55秒。從十年前的unix經驗。我希望後臺工作的運行速度幾乎和前臺工作一樣快。

有沒有方法可以加快PowerShell後臺作業的執行速度?

+0

在我的機器上啓動一個PowerShell窗口需要很長時間。但是在它加載後,它運行命令的速度非常快。可能是cron首先加載powershell,因此延遲。 –

+0

PowerShell_ISE在大約10秒內啓動,PowerShell在不到3秒的時間內完成。必須有別的東西。 –

+0

我已經在XP sp3和Windows 7 pro上測試過你的腳本,並且Windows server 2008 R2總是w/powershell 2.0,並且時間已過(按順序):〜6秒,〜5秒,〜4秒。 –

回答

4

此短的命令做同樣的事:

Measure-Command {Start-Job -Command {gci C:\Windows\System32\WindowsPowerShell\v1.0} | Wait-Job | Receive-Job} 

在Win8的測試瓦特/ PSv3是快給我〜3秒,在WinXP W/PSV2是〜15-30秒。

後臺作業被引入w/PsV2。從v2開始,他們有時間進行優化,現在PowerShell現在在v3中使用DLR,以便可以解釋性能差異。

它必須使用命令文本啓動另一個powershell進程,運行命令,發回序列化結果並拆除進程。

要了解它在做什麼,我運行了procmon而上面的命令正在運行,並且大部分時間powershell.exe正在讀取網絡和COM相關的註冊表項。

0

我在前臺運行速度很慢時也遇到了問題,但是您的問題對於單個命令非常明顯,以至於我懷疑它與成本或某些機器特定的產卵困難有關一個新的powershell過程。 (是的,你會爲每個併發作業獲得額外的powershell.exe。)但對很多人來說,這不僅僅是這些。這篇文章:(https://vwiki.co.uk/Background_Jobs_(PowerShell))提到作業默認情況下在PS中以低於正常優先級運行。有些帖子建議把作業代碼塊下面的一個解決大部分問題CPU:

[System.Threading.Thread]::CurrentThread.Priority = 'AboveNormal' 
([System.Diagnostics.Process]::GetCurrentProcess()).PriorityClass = 'AboveNormal' 

不幸的是我,我想作爲upposed到CPU的性能問題,我有一個I/O性能問題工作。這篇文章:(How to set Low I/O ("background") priority in Powershell)涉及增加內存和IO優先級的概念,但是我沒有看到讓我感覺舒服的答案。

PowerShell作業最重要的功能之一是並行執行多個作業。 PS作業的另一種選擇是PS「工作流程」,但似乎我仍對工作流程具有與作業相同的性能問題。非常令人沮喪。