以下の内容はhttps://tech.guitarrapc.com/entry/2013/06/17/190601より取得しました。


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つあります。

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

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

CIM(WMI)で取得

(Get-CimInstance -Class Win32_ComputerSystem).Name

環境変数$Env:COMPUTERNAMEで取得

$Env:COMPUTERNAME

.NETのNet.DnsでGetHostName()メソッドで取得

[Net.Dns]::GetHostName()

hostnameコマンドで取得

hostname

HostName取得実行結果

Measure-Commandの結果です。

処理種別 処理 所要時間
CIM (Get-CimInstance -Class Win32_ComputerSystem).Name 389.68ms
環境変数 $Env:COMPUTERNAME 147.0818ms
.NET [Net.Dns]::GetHostName() 121.98ms
hostname hostname 165.8101ms

.NETが最速ですね。

f:id:guitarrapc_tech:20160618023931p:plain

IP Address を取得する

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

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

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

Get-NetIPAddressで取得

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

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

# 3. IP Addressだけを取得したり渡すときに、 PowerShell 2.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の結果です。

処理種別 処理 所要時間
CIM (Get-CimInstance -Class Win32_ComputerSystem).Name 389.68ms
PowerShell Get-NetIPAddress 1183.11ms
PowerShell Get-NetIPAddress V3記法 1200.11ms
PowerShell Get-NetIPAddress V2記法 1233.11ms
.NET [Net.Dns]::GetHostAddresses() 189.55ms
.NET [Net.Dns]::GetHostAddresses() [1] 289.31ms
ipconfig ipconfig 386.26ms
PowerShell ipconfig 386.26ms

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

まとめ

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




以上の内容はhttps://tech.guitarrapc.com/entry/2013/06/17/190601より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14