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)で実行した結果は次のとおりだ。

PowerShell Core 6.0.2 / macOS

Group-Objectベンチ - PowerShell Core 6.0.2 macOS

Sort-Objectベンチ - PowerShell Core 6.0.2 macOS

Import-Csvベンチ - PowerShell Core 6.0.2 macOS

PSObjectベンチ - PowerShell Core 6.0.2 macOS

PowerShell Core 6.1 / macOS

Group-Objectベンチ - PowerShell Core 6.1 macOS

Sort-Objectベンチ - PowerShell Core 6.1 macOS

Import-Csvベンチ - PowerShell Core 6.1 macOS

PSObjectベンチ - 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コマンドレットでいろいろ実行速度を調べてもらえればと思う。

参考資料