前回のエントリでは多数のファイルに対して正規表現をかける処理をC++とPythonで書いき、Pythonのほうが圧倒的に速いという結果になりました。

Pythonは書き方が収斂するので大してチューニングなどはしませんが、
C++では自由度が高いため書き殴ったコードを数万回繰り返すのでは、パフォーマンスを大きく落としそうです。

今回はC++の方の実装を少し修正し、またC#版も書いてみました。

結果は以下のようになりました。(単位は秒)

実験設定 生grep Python + re C++ + boost.regex + ICU C# + Regex
A-1 8.972 9.468 13.250 28.6875
A-2 16.866 16.407 18.828 63.796875
A-3 21.857 15.078 27.765 75.0625
B-1 1.151 1.562 4.500 1.796875
B-2 3.292 3.328 5.812 2.671875
B-3 3.307 4.078 12.765 9.875

実験A、Bというのはデータセットの違いです。

また、1から3は検索するパターンの違い。ちょっと面倒なのでまたまとめ直すときにでも載せますが、

  1. 軽い
  2. ^.*$
  3. 軽い物を3段

としています。

前回よりC++も改善し、Pythonとそう変わらないまでに向上しました。
C#はファイル数が少ない場合は性能が良いですが、増えると極端に遅くなるようです。

よく見たら生のgrepよりもPythonの方が速い…

しかしPythonはろくなGUI デザイナがないので困ります。wxPython用のXRCedやGladeは重いし落ちるしバグまみれだし、PyQtは4.5未満はQPLかGPLだし。