PowerShell 7.0.0 Preview1の性能は?

前回は新しく公開された「PowerShell 7.0.0 Preview1」について取り上げた。このバージョンの最大の特徴は、ベースで採用している.NET Coreのバージョンが2.1から3.0へ移行したことにあるとされている。.NET Core 3.0へ移行したことでパフォーマンスが大幅に向上したという。

パフォーマンスにどの程度の差が出たのか実際に調べてみよう。本連載では、以前にPowerShell 6.1.0がリリースされたタイミングで高速になったという処理のベンチマークを行っている。当時は非常に高速になったという実証結果が得られたが、今回はこれと同じベンチマークを実施してみよう。

なお、実行環境はmacOSである。環境によってパフォーマンスが異なる可能性があること、執筆現在で公開されているのがPreview1という若いバージョンであることは考慮しておく必要がある。

ベンチマーク内容

実行するベンチマークは次のとおりだ。

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_UTF-8.CSV}

Import-CsvベンチではCSVファイルをデータとして使用する。ここでは「読み仮名データの促音・拗音を小書きで表記しないもの - zip形式 日本郵便」で公開されている全国一括 (1,687,251 Byte)をダウンロードしてきて、UTF-8に変換したデータをファイル名KEN_ALL_UTF-8.CSVとしてベンチマークを実行するディレクトリと同じディレクトリに置いて作業している。

KEN_ALL_UTF-8.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
...略...

Measure-Commandコマンドレットを使うとこんな感じで簡単にベンチマークを実施できることは、以前紹介したとおりだ。

ベンチマーク実行結果

ベンチマークはmacOSで「PowerShell Core 6.1.0」、「PowerShell Core 6.2.1」、「PowerShell 7.0.0 Preview1」で実行した。結果は次のとおり。

Group-Objectベンチ実行結果

Sort-Objectベンチ実行結果

Import-Csvベンチ実行結果

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

ベンチマーク結果グラフ

「PowerShell Core 6.1.0」と「PowerShell Core 6.2.1」の結果は誤差といったレベルだ。しかし、「PowerShell 7.0.0 Preview1」ではGroup-ObjectベンチとSort-Objectベンチの結果が逆に遅くなっている。

全体のパフォーマンスは向上している可能性も

以前取り上げたベンチマークと同じものを実行したわけだが、PowerShell 7では、.NET Coreのバージョンアップにより全体のパフォーマンス向上が謳われているのに対し、今回ベンチマーク対象としたのがミクロ的だったので、正しい検証とは言えないかもしれない。

プレビュー版だということもあるし、.NET Coreの関係でmacOSだけが遅いという可能性もある。全体として遅くなったのか速くなったのか、今回の結果だけだとよくわからない。

結局この手の比較は実際に実行してみないと、本当のところがわからない。自分で試してみるのはとても大切だ。今後月に1回ごとに提供されるPreview版のリリースを通じてパフォーマンスがどのように推移していくのか観察していくのもよいだろう。

参考資料