PowerShell 7.0.0 Preview1の性能測定
「PowerShell 7.0.0 Preview1」はベースで採用している.NET Coreのバージョンが.NET Core 2.1から.NET Core 3.0へバージョンアップしたことで、パフォーマンスが大幅に向上するとされている。
本連載では、実際にどの程度性能に差があるのか確認するためにこれまで2回にわたってmacOS MojaveとWindows 10でベンチマークを実施してきた。その結果、次のようなことが見えてきた。
- WindowsとmacOSではWindowsの方が高速に動作する
- WindowsではPowerShell 7.0.0 Preview1の方が実行速度が速い
- macOSではPowerShell 7.0.0 Preview1の方が実行速度が遅い
ただし、比較の対象はプレビュー版なので、デバッグオプションやビルドオプションなどが影響を与えている可能性もある。ビルドなどについては調べずに結果だけを見ているので、ここでの結果は参考程度にとどめておく必要はある。
実装の系統としてmacOS版とLinux版がそう大きく変わるとは思えないが、今回はUbuntu 18.04 LTSで同様のベンチマークを実施してみようと思う。
ベンチマーク内容
これまでと同じ内容だが、今回もベンチマークの内容を説明しておく。次のコマンドレットを実行したときの処理時間をベンチマーク結果としている。
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-UTF8.CSV}
Import-CsvベンチではCSVファイルをデータとして使用する。ここでは「読み仮名データの促音・拗音を小書きで表記しないもの - zip形式 日本郵便」で公開されている全国一括 (1,687,251 Byte)をダウンロードしてきて、エンコーディングをUTF-8に変更したものを使っている。
KEN_ALL-UTF8.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
...略...
次に今回計測したLinuxでの実行結果と、これまでに計測したmacOS MojaveとWindows 10での実行結果を次にまとめて掲載しておく。
ベンチマーク結果
ベンチ | Ubuntu 18.04 pwsh 6.2.1 | Ubuntu 18.04 pwsh 7.0.0p1 |
---|---|---|
Group-Objectベンチ | 16.03 | 14.57 |
Sort-Objectベンチ | 15.48 | 14.19 |
Import-Csvベンチ | 4.75 | 4.06 |
前々回紹介した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 |
前回紹介したWindows 10の実行結果
ベンチ | 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 |
ベンチマークからの考察
LinuxではPowerShell Core 6.2.1よりもPowerShell 7.0.0 Preview1の方が処理が高速になっていた。しかも、PowerShell Core 6.2.1ではベンチマーク結果が大きく上下するときがあったのだが、PowerShell 7.0.0 Preview1ではそれがなく安定していた。
PowerShell CoreはLinuxユーザの利用が増加しているとのことなので、そのせいでLinuxにおけるPowerShell Coreの開発がいい具合に進んでいるのかもしれない。また、LinuxではPowerShell Coreの基盤となるMonoなどの実装環境が優れている可能性も考えられる。
簡単なベンチマークだが、これまでの結果から大雑把に次のようなことが言えそうだ。
- PowerShell CoreまたはPowerShell 7はWindowsでの性能がもっとも優れている
- LinuxではPowerShell CoreよりもPowerShell 7の方が性能が期待できる
- macOSではPowerShell 7はあまり性能が期待できない
なぜmacOS版だけが性能が劣化しているのかはこのベンチマークだけからはわからないが、同じコマンドレットの実行でこれだけはっきりと差がでているので、なんらかの原因があるのだろう。もしかしたら実施時期が問題だった可能性もある。
PowerShell CoreまたはPowerShell 7はクロスプラットフォームでWindows、macOS、Linuxという複数のオペレーティングシステムで動作することにも魅力がある。macOSだけ性能がでないというのはちょっと悲しいものがある。今後の開発でこうした状況が改善するかどうか見ていきたいところだ。
参考資料
- PowerShell 7 Road Map|PowerShell
- PowerShell/PowerShell - v7.0.0-preview.1 Release of PowerShell|GitHub
- Microsoft PowerShell Module Browser
- Microsoft PowerShell6|Microsoft.PowerShell.Core|About|About Variables
- Microsoft PowerShell6|Object Pipeline
- Microsoft PowerShell6|Understanding the Windows PowerShell Pipeline
- Microsoft PowerShell6|About Regular Expressions