PowerShell Core 6.1パフォーマンス向上
先日公開されたPowerShell Coreの最新版である「PowerShell Core 6.1」で特に注目される機能改善のひとつがパフォーマンスの向上だ。PowerShell Core 6.1ではいくつかの点でパフォーマンスが大幅に向上している。パフォーマンスの向上はそれだけで新しいバージョンを使う理由になるほど魅力的なものだ。
連載当初はPowerShell Core 6.0.2を使っていた。「What’s New in PowerShell Core 6.1 | Microsoft Docs」にパフォーマンスが向上したことを示すわかりやすいベンチマーク方法が掲載されているので、これをmacOSのPowerShell Core 6.0.2およびmacOS PowerShell Core 6.1で比較した結果を紹介しよう。
パフォーマンス比較用コマンドレット
ここでは上記ページから抜粋および多少の変更を加えた次の4つのコマンドレットを実行する。
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}
PSObjectベンチ
Measure-Command {Get-Content ./KEN_ALL_UTF-8.JSON | ConvertFrom-Json}
Import-Csvでは「読み仮名データの促音・拗音を小書きで表記しないもの - zip形式 日本郵便」からダウンロードした2018年8月31日更新時点での全国一括 (1,686,673Byte) CSVデータをUTF-8に変換したCSVファイルを使っている。
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
...略...
PSObjectベンチでは上記CSVファイルの一部をJSONデータに変換したものを使っている。
JSONファイルのサンプル
[
{
"1": "01101",
"2": "060",
"3": "0600000",
"4": "ホツカイドウ",
"5": "サツポロシチユウオウク",
"6": "イカニケイサイガナイバアイ",
"7": "北海道",
"8": "札幌市中央区",
"9": "以下に掲載がない場合",
"10": 0,
"11": 0,
"12": 0,
"13": 0,
"14": 0,
"15": 0
},
{
"1": "01101",
"2": "064",
"3": "0640941",
"4": "ホツカイドウ",
"5": "サツポロシチユウオウク",
"6": "アサヒガオカ",
"7": "北海道",
"8": "札幌市中央区",
"9": "旭ケ丘",
"10": 0,
"11": 0,
...略...
パフォーマンスの向上はともかく実際に実験してみることが一番だと思う。時間がある方はぜひ追実験を行ってもらえればと思う。
PowerShell Core 6.0.2 vs 6.1性能比較
PowerShell Core 6.0.2 (macOS)およびPowerShell Core 6.1 (macOS)で実行した結果は次のとおりだ。
実行結果を表およびグラフにまとめると次のようになる。
macOS pwsh 6.0.2[秒] | macOS pwsh 6.1[秒] | |
---|---|---|
Group-Objectベンチ | 59.3 | 17.3 |
Sort-Objectベンチ | 28.7 | 17.3 |
Import-Csvベンチ | 20.4 | 5.6 |
PSObjectベンチ | 51.6 | 12.9 |
見てのとおり、PowerShell Core 6.1はPowerShell Core 6.0.2よりも特定の性能が大幅に向上していることがわかる。
パフォーマンスの向上とMeasure-Command
まず、今回の結果からはPowerShell Core 6.1で特定のパフォーマンスが大幅に向上していることを実感することができる。これはPowerShell 6.1にアップグレードする大きな動機になる。パフォーマンスの高さはそれだけで移行の理由になる。
もうひとつはMeasure-Commandというコマンドレットの使い方だ。PowerShell CoreではMeasure-Commandというコマンドレットを利用することができ、今回示したように簡単に処理時間を計測することができる。自分が組み上げたパイプラインや関数、スクリプトがどの程度の性能を出すのか簡単に調べることができる。PowerShell Coreのスクリプトはとかく遅くなりがちなので、このように計測する術を知っておくことは重要だ。
計測することができれば改善の足掛かりとすることができる。Measure-Commandコマンドレットでいろいろ実行速度を調べてもらえればと思う。
参考資料
- 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|Microsoft.PowerShell.Utility|Get-Random
- Microsoft PowerShell6|Microsoft.PowerShell.Utility|Group-Object
- Microsoft PowerShell6|Microsoft.PowerShell.Utility|Sort-Object
- Microsoft PowerShell6|Microsoft.PowerShell.Utility|Import-Csv
- Microsoft PowerShell6|Microsoft.PowerShell.Management|Get-Content
- Microsoft PowerShell6|Microsoft.PowerShell.Utility|ConvertFrom-Json