5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

2024年版 PowerShell 各ループの速度比較

Last updated at Posted at 2024-12-21

はじめに

先日こちらの記事を拝見しました。

衝撃でした。まさかPowerShellの代名詞と思ってた ForEach-Object がこんなにも遅かったなんて...

とはいえ元記事は2018年の記事なので、もしかしたら今は改善されているかもしれません。

ということで、そんな淡い期待も込めて自分の手元で計測してみたのでその結果を紹介します。

計測

元記事に記載のコードをそのまま使わせてもらいました。コピペで動くコードを貼ってくれる方は神ですね。

また対象は Windows PowerShell 5.1 に加えて PowerShell 7.4 (Windows PowerShell 5.1と同じWindows PC + MacBook Air) でも計測してみました。

環境

PowerShellの各バージョン ($PSVersionTable) は以下の通りです。

Windows PC
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
Windows PC
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
MacBook Air
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 (というよりエイリアスの%) を使っていこうと思います。

さいごに

いかがでしたか?

結局のところパフォーマンスの良しあしが影響するかはデータ量・用途次第なので、「こういう違いがある」というのを理解したうえでケースバイケースでなにを使うか選ぶのがいいのかなと思いますね。

最後まで読んでいただきありがとうございました。

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?