脚本的第一次运行较慢

时间:2019-01-19 10:53:24

标签: powershell

我正在做一些性能分析,发现有些异常。我想比较两种构建XML文件列表的方法。一种使用Get-ChildItem两次,第一种过滤单个文件,第二种基于文件名过滤,第二种方法使用Get-Item单个文件,使用Get-ChildItem再次多个文件。我都用Measure-Command包裹了。

当我运行它时,第一次运行显示第一次Measure-Command的时间要长得多,但是哪种方法优先是无关紧要的。而且它只是相当长一段时间内的第一个。因此,如果我们将两种方法称为GIGC(Get-ItemGet-ChildItem)和GCGC(Get-ChildItemGet-ChildItem),如果我有GIGC的命令,则使用GCGC,然后运行我将看到GIGC为2.5秒,GCGC为1.5秒。如果我立即重新运行,它们都将在1.5秒左右。一遍又一遍,它将保持约1.5秒。让控制台坐几分钟,GIGC将再次保持约2.5秒。但是,如果我扭转它,首先是GCGC,然后是GIGC,则数字保持不变。 GCGC这次的第一个Measure-Command为2.5秒,其余的均为1.5秒。将控制台放置足够长的时间,第一个控制台将备份。

$firmAssets = '\\Mac\Support\Px Tools\Dev 4.0'

Measure-Command {
    [Collections.ArrayList]$sourceDefinitions = @(Get-Item "$firmAssets\Definitions.xml") + @(Get-ChildItem $firmAssets -Filter:Definitions_*.xml -Recurse)
}
Measure-Command {
    [Collections.ArrayList]$sourceDefinitions = @(Get-ChildItem $firmAssets -Filter:Definitions.xml) + @(Get-ChildItem $firmAssets -Filter:Definitions_*.xml -Recurse)
}

起初,我认为问题可能出在Measure-Command上,所以我更改了代码以使用Get-Date作为计时器。结果相同。

$startTime = Get-Date
[Collections.ArrayList]$sourceDefinitions = @(Get-Item "$firmAssets\Definitions.xml") + @(Get-ChildItem $firmAssets -Filter:Definitions_*.xml -Recurse)
Write-Host "$(New-Timespan –Start:$startTime –End:(Get-Date))"

$startTime = Get-Date
[Collections.ArrayList]$sourceDefinitions = @(Get-ChildItem $firmAssets -Filter:Definitions.xml) + @(Get-ChildItem $firmAssets -Filter:Definitions_*.xml -Recurse)
Write-Host "$(New-Timespan –Start:$startTime –End:(Get-Date))"

因此,在最后一次测试中,我认为可能与控制台有关,因此我转换为脚本。奇怪的是,同样的结果!首次运行通常会比较慢。我的(未经教育的)猜测是,发生了一些内存初始化事件,该事件在第一次运行时发生,然后在多次使用PowerShell时保持初始化状态,无论是脚本还是控制台。基本上是某种形式的PowerShell开销,这感觉像是我们无法解决的事情。但是希望有人能比我“ PowerShell的工作原理,克服它”有更好的答案。

0 个答案:

没有答案