我编写了一个PowerShell模块,该模块从不同的源文件(即每个函数一个.ps1文件)中提取函数定义。这使我们(作为一个团队)可以并行处理不同的功能。模块(.psm1文件)获取可用.ps1文件的列表...
$Functions = Get-ChildItem -Path $FunctionPath *.ps1
...然后遍历列表并通过点源引入每个函数定义:
foreach($Function in $Functions) {
. $Function.Fullname # Can be slow
}
问题:我们注意到完成速度大约有10到180秒(大约50个源文件)变化很大,这取决于我们在哪台机器上进行测试。我们无法解释所花费时间的巨大差异,并且相信我们已经控制了变量,例如机器类型,操作系统,用户帐户,管理员权限,PS配置文件,PS版本等。相同主机在同一主机上花费的时间可能有所不同用户从一天到第二天。
我们确实想知道这是否与磁盘访问有关,并测试了我们可以从磁盘中读取数据的速度。事实证明,Get-Content
在所有这些文件上运行都非常快,我们在解决该问题的方法中利用了这一点:
foreach($Function in $Functions) {
Invoke-Expression (Get-Content $Function.Fullname -Raw) # Is quick
}
为什么通过点源添加这些功能比读取和执行文件内容要慢得多?