使用 HostName 更好地测试连接性能

Test-Connection Performance Better with HostName

使用 IP 地址的

运行 Test-Connection 比使用服务器主机名的 运行 相同命令花费的时间要长得多。

但是;如果我添加 -quiet 参数,则性能大致相同(IP 快一点,如您所料)。

使用Measure-Command这个异常没有出现;大概是输出没有显示的一些怪癖。

下面的代码更准确地反映了看到的异常情况:

$begin=(get-date).ticks;test-connection '123.45.67.89'; $a=((get-date).ticks - $begin)
$begin=(get-date).ticks;test-connection 'MyHostName'; $b=((get-date).ticks - $begin)
$a-$b

同事在自己的机器上重现了同样的问题

问题:有人知道是什么原因造成的吗? 也就是说,我怀疑这是一个错误(并且已经报告过),但这意味着 PowerShell 可能会根据是否显示输出/导致类似量子的效果而以不同的方式工作,这很聪明;所以它不仅仅是 运行 按顺序给出的命令,而是在幕后进行一些(去)优化。

我的环境

OS:MS Windows 7 Pro SP1

$PSVersionInfo:

Name                           Value                                  
----                           -----                                                                                                                                                  
PSVersion                      4.0                                     
WSManStackVersion              3.0                                     
SerializationVersion           1.1.0.1                                 
CLRVersion                     4.0.30319.18444                         
BuildVersion                   6.3.9600.16406                          
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0}                    
PSRemotingProtocolVersion      2.2

MS 连接错误

https://connect.microsoft.com/PowerShell/feedbackdetail/view/1578010/test-connection-performance-with-ip-and-output

我只是在 运行 Test-Connection 使用和不使用 Quiet 开关参数时进行了一次 Wireshark 跟踪,为 Computername 参数提供了一个 IPv4 地址。

当省略 Quiet 开关时,PowerShell 似乎发送的不是 1 个,而是 6 个 NetBIOS 名称查询到目标机器,然后 returns 格式化输出。

如果我 分配 来自 Test-Connection 的输出,它会立即 returns,但是一旦我将其通过管道传输到 Format-Table,它挂起并再次发送 NBSTAT 查询


根本原因实际上不是Test-Connection cmdlet 本身,而是格式化的输出。其中一个属性 (IPV4Address) 是 ScriptProperty 并且具有以下定义:

PS C:\> $ping = Test-Connection -ComputerName 10.0.0.101 -Count 1
PS C:\> Get-Member -InputObject $ping -Name IPV4Address | Select-Object -ExpandProperty Definition
System.Object IPV4Address {get=$iphost = [System.Net.Dns]::GetHostEntry($this.address)
                    $iphost.AddressList | ?{ $_.AddressFamily -eq [System.Net.Sockets.AddressFamily]::InterNetwork } | select -first 1;}

因此,当显示输出时,调用 [System.Net.Dns]::GetHostEntry(10.0.0.101) 来计算 IPV4Address - 这就是导致等待时间

的原因

如果您不关心IP地址的实际解析,请使用Select-Object来防止IPV4Address:

的计算和输出
Test-Connection -ComputerName 10.0.0.101 -Count 1 | Select Address,StatusCode