oregexp動いた
以前にoregexp動かない…と書いたが,その後動くようになった.
動かないと思っていたのは,テストコードだけだった模様.
eunitという別のモジュールが必要だったらしい.
eunitを見つけて入れてみたけど,やっぱりなんかうまくいかない.
(めんどくさいので深追いはしていない…)
とりあえずoregexp自体は正常に動作するのを確認できた.
こんな感じで利用できる.
1> oregexp_svr:start().
{ok,<0.33.0>}
2> oregexp:match("http://www.mikage.to/test.html", "([\\w\\.]+)").
{match,1,4,[{0,"http"},{1,"http"}]}
3> oregexp:match("http://www.mikage.to/test.html", "\/\/([\\w\\.]+)").
{match,6,15,[{0,"//www.mikage.to"},{1,"www.mikage.to"}]}
ベンチを取ってみると,かなり速い.
parseしてからmatchする方法であれば,parserを使う方法と同等以上の速度.
smp無しbeamで0.977秒くらいの速度が出た.
氷魚にゃさんにErlangからPerlを呼び出すモジュールを作ってもらい,限界までチューンしたけど,それより速い.
Perlの方は,関数呼び出しを1回挟まないとダメで,それが大きなオーバーヘッドになってしまっている模様.
oregexpベンチのソースは以下のような感じ.
-module(strregexpo).
-export([bench/0, bench/2]).
bench() ->
oregexp_svr:start(),
{ok, Reg} = oregexp:parse("^[^ ]+ [^ ]+ [^ ]+ \\[[^\\]]+\\] \"([^\"]+)\""),
Time = timer:tc(strregexpo, bench, [16#ffff, Reg]),
io:format("~w~n", [Time]).
bench(0, _Reg) ->
0;
bench(N, Reg) ->
String = "12.34.123.12 - - [17/Apr/2007:23:53:13 +0900] \"GET /html/1495.html HTTP/1.1\" 200 6980 \"http:/
/wiki.ffo.jp/html/2633.html\" \"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)\"\n",
oregexp:match(String, Reg),
bench(N - 1, Reg).
Erlangで文字列操作をするときは,oregexpが正解っぽい.
The comments to this entry are closed.
Comments