はじめに
先日こちらの記事を拝見しました。
衝撃でした。まさかPowerShellの代名詞と思ってた ForEach-Object
がこんなにも遅かったなんて...
とはいえ元記事は2018年の記事なので、もしかしたら今は改善されているかもしれません。
ということで、そんな淡い期待も込めて自分の手元で計測してみたのでその結果を紹介します。
計測
元記事に記載のコードをそのまま使わせてもらいました。コピペで動くコードを貼ってくれる方は神ですね。
また対象は Windows PowerShell 5.1 に加えて PowerShell 7.4 (Windows PowerShell 5.1と同じWindows PC + MacBook Air) でも計測してみました。
環境
PowerShellの各バージョン ($PSVersionTable
) は以下の通りです。
Name Value
---- -----
PSVersion 5.1.19041.5247
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.19041.5247
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
Name Value
---- -----
PSVersion 7.4.6
PSEdition Core
GitCommitId 7.4.6
OS Microsoft Windows 10.0.19045
Platform Win32NT
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
WSManStackVersion 3.0
Name Value
---- -----
PSVersion 7.4.5
PSEdition Core
GitCommitId 7.4.5
OS Darwin 23.6.0 Darwin Kernel Version 23.6.0: Fri Jul 5 17:56:39 PDT 2024; root:xnu-10063.141.1~2/RELEASE_ARM64_T8122
Platform Unix
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
WSManStackVersion 3.0
PCスペックはざっとこんな感じです。
- Windows
- CPU: AMD Ryzen 5 3500 (2020年2月発売)
- RAM: 16GB
- MacBook Air
- CPU: Apple M3 (2024年3月発売)
- RAM: 8GB
結果
結果はこんな感じになりました。元記事の結果も並べています。
感想
やっぱり ForEach-Object
がダントツで遅いんですね...
Windows PowerShell 5.1については、全体的に処理時間が短くなっているだけなので中身は特に変わってなさそうです。処理時間が短くなったのは単にマシンスペックがあがったからだと思われます。
ただ、処理時間の長かった方法ほど減少幅も大きいので昔よりはマシになったと言えなくもなさそうです。
PowerShell 7.4については、同じマシンでも5.1から7.4でどの方法も処理時間が半分くらいに短くなっていました。たぶん.NETのパフォーマンス向上によるものと思われます。
また7.4同士でもMacBook AirのM3チップだとさらに半分くらいになっていて、このレベルまでくると ForEach-Object
を使って遅いと感じるケースはほぼないんじゃないかと思いますね。
ただForEachメソッドだけWindowsよりMacの方が遅くなっているのが気になりますね。誤差なのか仕様なのか?チップセットの違いによるものとか?
結論としては、昔も今も、5.1も7.4も、foreach文までとそれ以降で差が大きいので、シェルスクリプトで繰り返し処理を書くならまずforeach文を検討する方針にしようかなと思いました。
一方で、ターミナルであればワンライナーで書けるメリットが大きいのとそこまでデータが大きくなることもなさそうなのでこれからも ForEach-Object
(というよりエイリアスの%
) を使っていこうと思います。
さいごに
いかがでしたか?
結局のところパフォーマンスの良しあしが影響するかはデータ量・用途次第なので、「こういう違いがある」というのを理解したうえでケースバイケースでなにを使うか選ぶのがいいのかなと思いますね。
最後まで読んでいただきありがとうございました。