Yash 2 その 135: シェルの実行速度比較 その 2
バグ 18126 の修正のためのコード変更が一通りできたので、簡単なベンチマークを取ってみたところ、パターンマッチング関連の実行速度が大きく低下していることが分かった。
以下、結果と考察。VirtualBox 上の Fedora 11 (x86) でのテストなので、システムコードの実行時間が本来よりかなり長くなっている筈だが、速いか遅いかの比較くらいはできよう。
シェル | real | user | sys |
---|---|---|---|
fnmatch.p.tst を 1000 回 | |||
dash | 0.54 | 0.42 | 0.09 |
busybox | 0.97 | 0.45 | 0.12 |
ksh | 1.50 | 0.96 | 0.03 |
mksh | 1.63 | 1.03 | 0.09 |
posh | 1.64 | 1.09 | 0.09 |
zsh | 2.36 | 0.92 | 0.35 |
旧 yash | 2.91 | 1.21 | 0.41 |
bash | 3.36 | 1.69 | 0.18 |
新 yash | 6.16 | 3.74 | 0.56 |
bash の configure | |||
ksh | 58.22 | 22.28 | 25.30 |
旧 yash | 81.07 | 28.95 | 40.60 |
新 yash | 81.89 | 28.78 | 40.82 |
mksh | 92.40 | 34.25 | 47.48 |
dash | 92.41 | 34.34 | 47.13 |
posh | 92.93 | 34.30 | 48.56 |
busybox | 93.27 | 34.20 | 47.74 |
zsh | 93.25 | 34.25 | 48.05 |
bash | 93.37 | 34.54 | 48.06 |
ファイル名展開 | |||
dash | 2.55 | 0.94 | 0.84 |
mksh | 2.73 | 0.98 | 0.81 |
posh | 2.98 | 1.13 | 0.76 |
busybox | 3.04 | 1.02 | 0.87 |
zsh | 14.01 | 7.14 | 1.31 |
旧 yash | 15.62 | 9.87 | 0.85 |
新 yash | 20.97 | 19.05 | 1.20 |
bash | 21.47 | 14.23 | 0.94 |
ksh | 24.67 | 15.32 | 0.81 |
比較に使用したシェルは以下の通り
- Yash (バグ 18126 修正前: http://svn.sourceforge.jp/svnroot/yash/yash/trunk/@1391)
- Yash (バグ 18126 修正後: http://svn.sourceforge.jp/svnroot/yash/yash/branches/fnmatch/@1391)
- Bash 4.0.23(1)
- Ksh 93t+ 2008-12-10
- Dash 0.5.5.1
- Mksh 39
- Posh 0.6.18
- Zsh 4.3.9
- Busybox v1.13.2
fnmatch.p.tst というのは今度の yash のリリースで追加予定のシェルスクリプトで、パターンマッチングの動作をテストする。このスクリプトは case 文によるパターンマッチングばかりを行うので、パターンマッチングの実行速度を比較するのに持って来いだ。ご覧の通り、元元速くはなかった yash のパターンマッチングが、今回のコード変更により二倍以上遅くなっていることが分かる。一方 dash は目を見張るほど速く、シェルによってパターンマッチングの速度が全然違うことが分かる。因みに、fnmatch.p.tst のテストに合格するのは、これらのシェルの中では新 yash のみである。
二つ目のベンチマークは、bash 4.0 のソース一式に付いてくる configure スクリプトを一回実行するのにかかる時間の測定である。Ksh が断トツの速さで、それに新旧の yash が続く。他のシェルはどれも似たり寄ったりである。三万行余りのスクリプトのうちパターンマッチングを行う箇所は数百程度しかないので、新旧の yash 同士を比べてもあまり差はない。Ksh は速さを追求するために色色と気持ちの悪いことを行うシェルなので (例えば前回の結果にあるようにサブシェルを fork せずに実行したりする)、ksh が一位であることは当然ともいえるが、yash が他のシェルよりやや速い理由は俺自身よく分かっていない。
三つ目は for i in `seq 1000`; do : /usr/bin/*[r-t]*; done
を実行するのにかかる時間の測定。この測定ではパス名展開を行うので、パターンマッチングの速度だけではなくファイル検索の速度も問題になる。fnmatch.p.tst で圧倒的な速さを見せた dash がこのテストでも一位になった。その他 posh, mksh, busybox も速い。一方 zsh, bash, yash, ksh は何倍も遅い。Ksh はパターンマッチングは速いがファイル検索は遅いようだ。
| 固定リンク
コメント