Performance 使用主机名更好地测试连接性能

Performance 使用主机名更好地测试连接性能,performance,powershell,ping,Performance,Powershell,Ping,使用IP地址运行测试连接,比使用服务器主机名运行同一命令花费的时间要长得多 但是,;如果我添加-quiet参数,那么性能大致相同(正如您所预期的,IP快了一小部分) 使用测量命令不会显示此异常;可能是输出的某些奇怪之处没有显示出来 以下代码更准确地反映了所看到的异常: $begin=(get-date).ticks;test-connection '123.45.67.89'; $a=((get-date).ticks - $begin) $begin=(get-date).ticks;test

使用IP地址运行
测试连接
,比使用服务器主机名运行同一命令花费的时间要长得多

但是,;如果我添加
-quiet
参数,那么性能大致相同(正如您所预期的,IP快了一小部分)

使用
测量命令
不会显示此异常;可能是输出的某些奇怪之处没有显示出来

以下代码更准确地反映了所看到的异常:

$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
同事们在他们的机器上复制了同样的问题

问题:有人知道这可能是什么原因吗? i、 e.我怀疑这是一个bug(并且已经报告过了),但这意味着有一些聪明的事情正在发生,PowerShell可能会根据是否显示输出/导致量子效应而不同地工作;因此,它不仅仅是按顺序运行给定的命令,而是在幕后进行一些(去)优化

我的环境

操作系统: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连接错误


我只是在运行
测试连接时做了一次Wireshark跟踪,该连接使用和不使用
Quiet
开关参数,为
Computername
参数提供一个IPv4地址

当省略
Quiet
开关时,PowerShell似乎不会向目标计算机发送1个,而是6个NetBIOS名称查询,然后返回格式化的输出

如果我从
测试连接
分配输出,它会立即返回,但一旦我将其传输到
格式表
,它就会挂起并再次发送NBSTAT查询


根本原因实际上不是
测试连接
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

建议:不要用Get Date做这样的法医测量。使用
[System.Diagnostics.Stopwatch]::StartNew()
。我能够重现BTW这是猜测(尚未进行网络跟踪),但可能是PowerShell尝试对IP执行反向查找,以解析为output@MathiasR.Jessen; 喊得好;我想知道在ping发生之前是否存在这种情况,但无法找出隐藏输出会对其产生什么样的影响。。。如果它只在输出结果时这样做,那么对于所看到的结果来说,这更有意义。奇怪的是,他们在每次迭代中都会进行查找,而不是缓存,但可能是有原因的(也许是在ping之间DNS发生变化的情况下)?找到了罪魁祸首,稍后将上传截图和进一步解释