前回のエントリでは多数のファイルに対して正規表現をかける処理を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というのはデータセットの違いです。
- A: linuxのカーネルソースコード 2.6.28.7 約2.5万ファイル、323MB
- B: 日英対訳文対応付けデータ 約2000ファイル、144MB
また、1から3は検索するパターンの違い。ちょっと面倒なのでまたまとめ直すときにでも載せますが、
- 軽い
- ^.*$
- 軽い物を3段
としています。
前回よりC++も改善し、Pythonとそう変わらないまでに向上しました。
C#はファイル数が少ない場合は性能が良いですが、増えると極端に遅くなるようです。
よく見たら生のgrepよりもPythonの方が速い…
しかしPythonはろくなGUI デザイナがないので困ります。wxPython用のXRCedやGladeは重いし落ちるしバグまみれだし、PyQtは4.5未満はQPLかGPLだし。

No Comments yet »
コメント RSS TrackBack URI
コメントをどうぞ