为什么Powershell作业如此缓慢?

当我在本地执行简单的陈述时

$path = 'C:WindowsSystem32WindowsPowerShellv1.0'
gci $path

我立即看到了答复。 但是当我在本地机器上执行它作为工作时

$start = get-date
$path = 'C:WindowsSystem32WindowsPowerShellv1.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后台作业的执行?


这个较短的命令做同样的事情:

Measure-Command {Start-Job -Command {gci C:WindowsSystem32WindowsPowerShellv1.0} | Wait-Job | Receive-Job}

在Win8 beta w / PSv3上它对我来说很快〜3秒,在WinXp w / PSv2上它是〜15-30秒。

背景工作是在Ps / 2引入的。 从v2开始,他们有时间进行优化,现在PowerShell现在在v3中使用DLR,以便可以解释性能差异。

它必须使用命令文本启动另一个PowerShell进程,运行命令,发回序列化结果并拆除进程。

为了找出它在做什么,我跑了procmon,而上面的命令正在运行,并且大部分时间powershell.exe正在读取网络和COM相关的注册表项。


我在前台运行速度很慢的时候遇到了一些问题,但是您的问题对于单个命令来说非常明显,以至于我怀疑这些问题与产生新的PowerShell过程的成本或某些机器特定的困难有关。 (是的,你会为每个并发作业获得额外的powershell.exe。)但对很多人来说,这不仅仅是这些。 这篇文章:( https://vwiki.co.uk/Background_Jobs_(PowerShell))提到作业默认情况下在PS中以普通优先级运行。 一些帖子建议在作业代码块中放置下列其中一项来解决大多数CPU问题:

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

不幸的是,对于我来说,我认为自己遇到的I / O性能问题与作业中的CPU性能问题无关。 这篇文章:(如何在Powershell中设置低I / O(“背景”)优先级)涉及增加内存和IO优先级的概念,但我没有看到让我感觉舒服的答案。

PowerShell作业最重要的特性之一是并行执行多个作业。 PS作业的另一种选择是PS“工作流程”,但似乎我仍对工作流程具有与作业相同的性能问题。 非常令人沮丧。

链接地址: http://www.djcxy.com/p/59471.html

上一篇: Why are Powershell Jobs so slow?

下一篇: inject a transient @ManagedProperty at deserializing?