[ruby-list:47305] Re: マッチしない正規表現「.*?」が遅い?

From: SATOH Fumiyasu <fumiyas@...>
Date: 2010-08-17 02:44:33 UTC
List: ruby-list #47305
さとうふみやす @ OSSTech です。

At Tue, 17 Aug 2010 08:43:44 +0900,
dezawa@aliadne.net wrote:
> rubyの実装に詳しいわけでも、正規表現に強いわけでもないですが。。。

同じく…。

> 変数 t の中に9999回現れる "<X" が/<X(?:\s[^>]*)?>.*?<\/Y>/の
> 頭にマッチします。ですから 9999回 変数tの最後まで評価します。
> だから遅いのでは。

("<X\n><Y\n>"*9999).lenth はたったの 79992 ですから、それを 9999回
だとしても、CPU にとっては大したことはないんじゃないでしょうか。
ちなみに CPU は Intel Core 2 Duo T7100 (1.8GHz) を使っています。

先のメールの実行例にあるように、Perl や Python では一瞬で
終わるので、Ruby の実装に特徴か問題があるんじゃないかと思っているのですが。
Ruby 1.9 でも同じく遅いので、正規表現エンジンの問題ではなさそうです。

> /<X(?:\s[^>]*)?>.*?<\/Y>/ ですと文字列最後まで評価するのは 一ヶ所だけだったのが
> /<X(?:\s.*?)?>.*?<\/Y>/ ですと、二ヶ所になるのでさらに遅くなる。
> 
> "<X" の出現回数 9999回文字列最後まで評価していたのが
> 8万*9999回(8万の方はだんだん少なくなるけれど)文字列の最後まで評価することになりますから。

-- 
-- Name: SATOH Fumiyasu (fumiyas @ osstech co jp)
-- Business Home: http://www.OSSTech.co.jp/
-- Personal Home: http://www.SFO.jp/blog/

In This Thread