From: Kazunori NISHI Date: 1998-06-23T07:47:11+09:00 Subject: [ruby-dev:2973] Re: Regexp の実行が遅い気がします 西@九大です。 From: matz@netlab.co.jp (Yukihiro Matsumoto) > に変えてexact stringを伸ばすだけで劇的に速くなりますが…. > # 具体的にはhttpからgoo.ne.jpになってます. おぉ、速くなりました!(0.02秒) 「.」のクォートし忘れが、ここまで影響するとは思いませんでした、失礼。 しかし、「選択(a|b|c)」を加えると、また 2秒台に戻ってしまいます。 ---------------------------------------------------------------------- if /(\S+).*\[([^\]]+)\][^"]*"([^"]*)".*http:\/\/(infoseek\.com|goo\.ne\.jp|infoseek\.co\.jp)\/\S*\??(\S*)/ ---------------------------------------------------------------------- #'goo\.ne\.jp' を '(infoseek\.com|goo\.ne\.jp|infoseek\.co\.jp)' へ 試しに、先頭に「^」をつけてみると、0.04秒になりました。 それは、また別モノという話もありますが。 「(a|b|c)」が遅い?と邪推して、マッチングを複数回に分けてみる(↓)と、 0.02秒 と、速くなったりします。 ---------------------------------------------------------------------- RegexHead = '(\S+).*\[([^\]]+)\][^"]*"([^"]*)".*http://' RegexTail = '/\S*\??(\S*)' RobotHostsHash = { 'goo.ne.jp' => ['mt', 'aw'], 'infoseek.co.jp' => 'qt', 'infoseek.com' => 'qt', } CompiledRegexArray = RobotHostsHash .keys .collect { |host| Regexp .compile( RegexHead + host .gsub('\.', '\.') + RegexTail ) } while access_log = gets CompiledRegexArray .each do |regex| if access_log =~ regex break end end end ---------------------------------------------------------------------- 「パターンが複雑になっても、マッチング回数が少ない方が速い」という先入 観があったのですが、こういうものなんでしょうか? とは言え、この事例に関して言えば、$1, $2,... の参照で楽をしようとした のがどうも失敗のようで、単に ---------------------------------------------------------------------- if /http:\/\/(infoseek\.com|goo\.ne\.jp|infoseek\.co\.jp)/ ---------------------------------------------------------------------- でまず抜き出し、$`, $' から、さらに抽出すべきでした。これだと、0.02秒。 > などの悪条件が重なっているようです.しかし,それでも遅すぎる > ので,なんとかしたいのですが,すぐには対策が思い付きません. ruby-4.0 くらいまでには、お願いします。 > |「Regexp 関係にバグがある」事を期待しつつ、とりあえず御報告まで。 > > とくにこれというバグではなく,ちょっとずつまずい点が重なって > の現象のようです.いやな感じ.^^;;; そうですね、これだと「バグの存在」を期待してる厭味な人みたいですね。 失礼しました。「Regexp 関係のバグの露呈」を期待しつつ、C-cC-c ------------------------------------------------------------------ 九州大学大学院システム情報科学研究科 情報工学専攻 博士後期課程二年 西 和則 ( e-mail: kazunori@swlab.csce.kyushu-u.ac.jp ) ------------------------------------------------------------------