PowerShell自动展开功能以及引发的性能问题


适用于PowerShell 3.0或者更高版本

在PowerShell3.0以后,引入了一个新功能,被称为“自动展开”。有了它的支持,你可以这样写代码:

(Get-ChildItem -Path $env:windir\system32 -Filter *.dll).VersionInfo

这行代码会将System32 子目录下的所有的dll的的版本信息返回,在“自动展开”功能尚未诞生以前,你可能必须写一个循环,才能达到类似的效果:

Get-ChildItem -Path $env:windir\system32 -Filter *.dll |
 ForEach-Object { $_.VersionInfo }

运行这两个例子,结果确实相同,但是显然“自动展开”的写法更简洁。它执行时可能卡一小会,才能看到结果,第一个例子中的代码可能会卡10秒钟,你能才看到结果。而第二个例子中的经典写法却几乎可以迅速看到结果。

其实它们的整体性能有所差异,第一个例子中的“自动展开”的写法,就好比这样:

$data = Get-ChildItem -Path $env:windir\system32 -Filter *.dll
Foreach ($element in $data) { $element.VersionInfo }

总结:自动展开的写法固然灵活,但是经典的循环可以带来更高的执行效率。

荔非苔注:其实自动展开,明显偷梁换柱,把可能的流模式管道转换成了顺序模式,在处理海量数据时,不推荐使用。

原文链接:Automatic Unrolling and Memory Consumption

×用微信扫描并分享
本文链接: https://www.pstips.net/automatic-unrolling-and-memory-consumption.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

关于 Mooser Lee

我是一个Powershell的爱好者,创建了PowerShell中文博客,热衷于Powershell技术的搜集和分享。本站部分内容来源于互联网,不足之处敬请谅解,并欢迎您批评指正。

发表评论

电子邮件地址不会被公开。 必填项已用*标注