tech.guitarrapc.cóm

Technical updates

PowerShellで HostName や IP Address を取得する時に早いのはどれ

PowerShellでは、HostName や IP Address を取得するのにいくつかやり方が考えられます。 今回、PSRemoting中に取得するに当たって、どの方法が最も実行速度が速いのかを測ってみたので公開します。

 

検証環境

以下を 同一Zoneの Public VPCからPrivate VPC x2 に向けて10回実行した結果で、単一インスタンスに対して最も遅かった時間(ms)を取得しています。 (初回のDNS解決はICMPで処理済み)

  • PS Remoting 接続元サーバー (Public VPC)

Amazon AWS EC2 インスタンス (m1.large) with Windows Server 2012

  • PS Remoting 接続先サーバー x 2 (Private VPC)

Amazon AWS EC2 インスタンス (m1.medium) with Windows Server 2012

HostName を取得する

ぱっと思いつくやり方で4つあります。

  1. CIM (WMI) から取得する
  2. 環境変数 $Env:COMPUTERNAME から取得する
  3. Net.DnsでGetHostName()メソッドを利用する
  4. hostnameコマンドから取得する

実行コマンド例

それぞれこのように取得できます。

  • CIM (WMI) から取得する
(Get-CimInstance -Class Win32_ComputerSystem).Name
  • 環境変数 $Env:COMPUTERNAME から取得する
$Env:COMPUTERNAME
  • Net.DnsでGetHostName()メソッドを利用する
[Net.Dns]::GetHostName()
  • hostnameコマンドから取得する
hostname

HostName 取得実行結果

それぞれmeasure-commandでの取得結果です。

CIM Environment Variables .NET hostname
(Get-CimInstance -Class Win32_ComputerSystem).Name $Env:COMPUTERNAME [Net.Dns]::GetHostName() hostname
389.68ms 147.0818ms 121.98ms 165.8101ms

.NETが最速ですね。

 

f:id:guitarrapc_tech:20160618023931p:plain

IP Address を取得する

ぱっと思いつくやり方で3つあります。

  1. Get-NetIPAddress から取得する
  2. Net.DnsでGetHostAddresses('').IPAddressToStringを利用する
  3. ipconfig コマンドから取得する

実行コマンド例

小細工を3つ足して、それぞれこのように取得できます。

  • Get-NetIPAddress から取得する
# 1. Ethernetとアダプタ名のつくものを選択しています。
(Get-NetIPAddress | where{$_.InterfaceAlias -eq "Ethernet"}).IPAddress

# 2. IP Addressだけを取得したり渡すときに、 PowerShell V3.0 の省略記法で書くと
(Get-NetIPAddress | where InterfaceAlias -eq "Ethernet" | select -ExpandProperty IPAddress)

# 3. IP Addressだけを取得したり渡すときに、 PowerShell V2.0 の記法で書くと
Get-NetIPAddress | where{$_.InterfaceAlias -eq "Ethernet"} | select -ExpandProperty IPAddress
  • Net.DnsでGetHostAddresses('').IPAddressToStringを利用する
#4. 纏めて取得
[Net.Dns]::GetHostAddresses('').IPAddressToString

#5. ただしこれでは、IPが複数取れてしまうので、自分のIPだけを取得します。
[Net.Dns]::GetHostAddresses('').IPAddressToString[1]
  • ipconfig コマンドから取得する
#6. 文字列操作 (白目
ipconfig | where{$_ -match "IPv4 Address. . . . . . . . . . . : (?.*)"} | %{$Matches.ip}

IP Address 取得実行結果

それぞれmeasure-commandでの取得結果です。 PowerShellコマンドレットから

Summary PowerShell
Command Get-NetIPAddress Get-NetIPAddress V3記法 Get-NetIPAddress V2記法
Duration 1183.11 ms 1200.11 ms 1233.11 ms

続いて、.NET

Summary .NET
Command [Net.Dns]::GetHostAddresses() [Net.Dns]::GetHostAddresses() [1]
Duration 189.55 ms 289.31 ms

最後にipconfig

Summary ipconfig
Command ipconfig
Duration 386.26 ms

またしても.NETが最速ですね。

まとめ

速度重視なら .NET 利用が最速ですね。 外部コマンドより早いのは流石でした。 PipeLine でつなげたり、しれっと取得するなら PowerShell Cmdletなのですが、速度的にはアレなのは何時もの通りです。