GNU sedのパフォーマンス
GNU grepとGNU 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 sed、GNU awk、GNU grepの中では、GNU sedのソースコードがいちばんきれいで読みやすいと思います。