我正在做一些性能分析,发现有些异常。我想比较两种构建XML文件列表的方法。一种使用Get-ChildItem
两次,第一种过滤单个文件,第二种基于文件名过滤,第二种方法使用Get-Item单个文件,使用Get-ChildItem
再次多个文件。我都用Measure-Command
包裹了。
当我运行它时,第一次运行显示第一次Measure-Command
的时间要长得多,但是哪种方法优先是无关紧要的。而且它只是相当长一段时间内的第一个。因此,如果我们将两种方法称为GIGC(Get-Item
和Get-ChildItem
)和GCGC(Get-ChildItem
和Get-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的工作原理,克服它”有更好的答案。