Measure-Command或StopWatch返回令人困惑/不准确的结果

时间:2016-04-07 15:06:30

标签: performance powershell login vbscript

我正在尝试提高我从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

1 个答案:

答案 0 :(得分:5)

Measure-Command将丢弃管道输出,仅测量实际执行命令所需的时间。

秒表计时器正在测量执行命令所需的时间,然后将所有输出显示到控制台。

要让Measure-Command测量写入控制台所需的时间,请在您正在测量的脚本块中向Out-Host添加显式管道。然后,您应该看到写入控制台的输出,以及完成的测量时间的相应增加。