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