我正在尝试提高我从VBS转换的PowerShell登录脚本的性能,并且在我的测试中遇到了问题。
我编写了以下测试,试图找到检索连接到当前计算机的所有驱动器的最快方法:
################################################################# PSDrive
Measure-Command { Get-PSDrive -PSProvider 'FileSystem' }
$sw = [Diagnostics.Stopwatch]::StartNew()
Get-PSDrive -PSProvider 'FileSystem'
$sw.Stop()
$elapsed = $sw.Elapsed.TotalMilliseconds
write-host $elapsed
############################################################# END PSDrive
##################################################################### WMI
Measure-Command { Get-WMIObject -query "Select * From Win32_LogicalDisk Where DriveType = 4" }
$sw = [Diagnostics.Stopwatch]::StartNew()
Get-WMIObject -query "Select * From Win32_LogicalDisk Where DriveType = 4"
$sw.Stop()
$elapsed = $sw.Elapsed.TotalMilliseconds
write-host $elapsed
################################################################# END WMI
如您所见,我使用两种不同的方法来检索驱动器:
Get-PSDrive
Get-WMIObject
我也使用两种不同的技术来测量每个命令的速度:
Measure-Command
[Diagnostics.Stopwatch]::StartNew()
然而,根据使用哪种方法测量所花费的时间,两种驱动检索技术中的每一种都被测量得更快。这是上面脚本的一些示例输出(我刚刚提供了相关的详细信息):
获取-PSDrive来
测量命令(TotalMilliseconds):0.6983
秒表(TotalMilliseconds):408.9745
获取-WmiObject可以
测量命令(TotalMilliseconds):46.8607
秒表(TotalMilliseconds):158.0209
秒表(TotalMilliseconds):158.0209
所以我的问题是,哪一个(如果有的话)更可靠?或者是试图以这种方式测量我的代码完全浪费时间?非常感谢任何帮助。
更新
修改了将每个命令发送到变量(例如$x = Get-PSDrive -PsProvider 'FileSystem'
)的代码,现在输出更有意义:
获取-PSDrive来
测量命令(TotalMilliseconds):0.6983
秒表(TotalMilliseconds):408.9745
获取-WmiObject可以
测量命令(TotalMilliseconds):46.8607
秒表(TotalMilliseconds):158.0209
答案 0 :(得分:5)
Measure-Command
将丢弃管道输出,仅测量实际执行命令所需的时间。
秒表计时器正在测量执行命令所需的时间,然后将所有输出显示到控制台。
要让Measure-Command
测量写入控制台所需的时间,请在您正在测量的脚本块中向Out-Host
添加显式管道。然后,您应该看到写入控制台的输出,以及完成的测量时间的相应增加。