GNU sedのパフォーマンス

GNU grepGNU awk (Gawk) のパフォーマンス向上についてお話したので、今度はGNU sedを見てみましょう。

GNU sed 4.2.1

Red Hat Enterprise Linux 6にバンドルされているGNU sed 4.2.1でテストしてみました。

$ yes jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj | head -10000000 >../k

$ time -p env LC_ALL=C sed -ne '/a\|b/p' ../k
real 2.22
user 2.17
sys 0.05

$ time -p env LC_ALL=ja_JP.eucJP sed -ne '/a\|b/p' ../k
real 11.91
user 11.82
sys 0.08

$ time -p env LC_ALL=C gawk '/a|b/ { print }' ../k
real 2.65
user 2.58
sys 0.07

$ time -p env LC_ALL=ja_JP.eucJP gawk '/a|b/ { print }' ../k
real 13.96
user 13.86
sys 0.09

同じくRed Hat Enterprise Linux 6にバンドルされているGawk 3.1.7よりも高速であることがわかります。

GNU sed 4.2.2

執筆時点の最新版GNU sed 4.2.2 (2012-12-12) リリースでテストしてみました。

$ time -p env LC_ALL=C gawk '/a|b/ { print }' ../k
real 2.20
user 2.13
sys 0.07

$ time -p env LC_ALL=ja_JP.eucJP gawk '/a|b/ { print }' ../k
real 11.89
user 11.81
sys 0.07

$ time -p env LC_ALL=C ./gawk '/a|b/ { print }' ../k
real 2.29
user 2.22
sys 0.07

$ time -p env LC_ALL=ja_JP.eucJP ./gawk '/a|b/ { print }' ../k
real 5.37
user 5.28
sys 0.08

ということで、Red Hat Enterprise Linux 6にバンドルされているGNU sed 4.2.1とほとんど変わりませんでした。なので、最新版対決ではパフォーマンスが向上したGNU awkに軍配です。

GNU sed開発中版 (Git)

GNU sed 4.2.2以降の状況ですが、GNU sed 4.2.2のリリースと同時にGNU sedの作者の1人であるPaolo Bonzini氏がGNUの方針に賛同できないことを理由にメンテナーを辞任してしまいました。そのことが影響しているのか、最近はほとんど更新されておらず、メーリングリストにおける議論も活発ではありません。

まとめと解説

GNU sed < GNU awk < GNU grepでした。内部的な話をすると、GNU sedは「regex」のみ使用、GNU awkは「regex」およびそれよりも対応しているパターンが少ないものの高速な「dfa」を使用、GNU grepは「regex」および「dfa」に加えて固定文字列を超高速で検索する「KWset」を使用しています。なので、パフォーマンスにおいてGNU sed < GNU awk < GNU grepとなるのは当然といえます。

ちなみに、私見ですがGNU sedGNU awkGNU grepの中では、GNU sedソースコードがいちばんきれいで読みやすいと思います。