PowerShell 7.0.0 Preview1の性能測定

「PowerShell 7.0.0 Preview1」はベースで採用している.NET Coreのバージョンが.NET Core 2.1から.NET Core 3.0へ移行したことで、パフォーマンスが大幅に向上するとされている。

確認のために前回、PowerShell 6.1のときと同じベンチマークを実施してみたが、逆にパフォーマンスが悪化する結果となった。

ただし前回は、PowerShellの”ホームグランド”であるWindows 10ではなくmacOS Mojaveで実施している。Windows 10で実施するとまた違った結果が得られる可能性がある。今回は前回と同じベンチマークをWindows 10で実施してみよう。

ベンチマーク内容

実行するベンチマークは次のとおりだ。前回と同じである。

処理するCSVデータのエンコーディングはUTF-8には変更せずにダウンロードしてきたファイルのまま実行している。Windows 10で処理する場合には変更する必要がないためだ。

Group-Objectベンチ

Measure-Command { 1..100000 | % {Get-Random -Minimum 1 -Maximum 10000} | Group-Object }

Sort-Objectベンチ

Measure-Command { 1..100000 | % {Get-Random -Minimum 1 -Maximum 10000} | Sort-Object }

Import-Csvベンチ

Measure-Command {$a = Import-Csv -Header '1','2','3','4','5','6','7','8','9','10','11','12','13','14','15' KEN_ALL.CSV}

Import-CsvベンチではCSVファイルをデータとして使用する。「読み仮名データの促音・拗音を小書きで表記しないもの - zip形式 日本郵便」で公開されている全国一括 (1,687,251 Byte)である。

KEN_ALL.CSV

01101,"060  ","0600000","ホツカイドウ","サツポロシチユウオウク","イカニケイサイガナイバアイ","北海道","札幌市中央区","以下に掲載がない場合",0,0,0,0,0,0
01101,"064  ","0640941","ホツカイドウ","サツポロシチユウオウク","アサヒガオカ","北海道","札幌市中央区","旭ケ丘",0,0,1,0,0,0
01101,"060  ","0600041","ホツカイドウ","サツポロシチユウオウク","オオドオリヒガシ","北海道","札幌市中央区","大通東",0,0,1,0,0,0
01101,"060  ","0600042","ホツカイドウ","サツポロシチユウオウク","オオドオリニシ(1-19チヨウメ)","北海道","札幌市中央区","大通西(1〜19丁目)",1,0,1,0,0,0
01101,"064  ","0640820","ホツカイドウ","サツポロシチユウオウク","オオドオリニシ(20-28チヨウメ)","北海道","札幌市中央区","大通西(20〜28丁目)",1,0,1,0,0,0
01101,"060  ","0600031","ホツカイドウ","サツポロシチユウオウク","キタ1ジヨウヒガシ","北海道","札幌市中央区","北一条東",0,0,1,0,0,0
01101,"060  ","0600001","ホツカイドウ","サツポロシチユウオウク","キタ1ジヨウニシ(1-19チヨウメ)","北海道","札幌市中央区","北一条西(1〜19丁目)",1,0,1,0,0,0
01101,"064  ","0640821","ホツカイドウ","サツポロシチユウオウク","キタ1ジヨウニシ(20-28チヨウメ)","北海道","札幌市中央区","北一条西(20〜28丁目)",1,0,1,0,0,0
01101,"060  ","0600032","ホツカイドウ","サツポロシチユウオウク","キタ2ジヨウヒガシ","北海道","札幌市中央区","北二条東",0,0,1,0,0,0
01101,"060  ","0600002","ホツカイドウ","サツポロシチユウオウク","キタ2ジヨウニシ(1-19チヨウメ)","北海道","札幌市中央区","北二条西(1〜19丁目)",1,0,1,0,0,0
...略...

ベンチマーク結果 - Windows 10ではパフォーマンス向上を確認

ベンチマークはWindows 10 で「PowerShell Core 6.2.0」および「PowerShell 7.0.0 Preview1」で実行した。ベンチマーク結果は次のとおり。

Group-Objectベンチ実行結果

Sort-Objectベンチ実行結果

Import-Csvベンチ実行結果

ベンチ Windows 10 pwsh 6.2.0 Windows 10 pwsh 7.0.0p1
Group-Objectベンチ 9.0 6.45
Sort-Objectベンチ 7.64 5.40
Import-Csvベンチ 4.23 3.77

ベンチマーク結果グラフ (Windows 10)

ご覧の通り、Windows 10ではpwsh 6.2.0からPowerShell 7 Preview1への変更でパフォーマンスが向上したことを確認できる。予想どおりの結果だ。

比較のために、macOS Mojaveで実施した前回の結果を次に掲載する。

ベンチ macOS pwsh 6.2.1 macOS pwsh 7.0.0p1
Group-Objectベンチ 16.39 20.26
Sort-Objectベンチ 16.25 20.30
Import-Csvベンチ 4.36 4.68

ベンチマーク結果グラフ (macOS Mojave)

これを見ると、そもそもWindows 10で動作するPowerShell CoreはmacOS Mojaveで動作するPowerShell Coreよりも性能がよいことがわかる。もともとWindowsで開発されてきた技術であるため、然もありなんといったところだが、計測してみるとその違いがよくわかる。

PowerShell 7.0.0 Preview1の実装が同じだとすれば、macOS Mojaveにおける.NET Core 3.0(最新版はPreview6)の性能があまり優れた状態ではないとも考えられる。その場合、macOSにおける.NET Core 3.0のパフォーマンスが向上すればPowerShell Core 7の性能も向上するのだろう。

とはいえ、macOSで.NET Coreを必要とする状況はそれほど多くないだろうから、対応の優先順位が高くなるとはなかなか考えづらい。現在は、macOSでWindows 10と同じソフトウェアが動作する環境を作ってくれているエンジニアらに感謝の念を持って改善を待つのがよさそうだ。

参考資料