From: Yusuke ENDOH Date: 2008-02-15T01:26:39+09:00 Subject: [ruby-dev:33785] String#sub with ascii string fails to cache Regexp 遠藤です。 sub や gsub は第一引数が文字列の時、その文字列を rb_reg_quote したものを rb_reg_regcomp でキャッシュします。 $ time LANG=C ./ruby -ve 'n = "\u3042" * 1000; 30000.times { "".sub!(n, "") }' ruby 1.9.0 (2008-02-14 revision 15475) [i686-linux] real 0m1.340s user 0m1.300s sys 0m0.030s でも、その文字列が ascii のみである場合はキャッシュに失敗する ようです。 $ time LANG=C ./ruby -ve 'n = "abc" * 1000; 30000.times { "".sub!(n, "") }' ruby 1.9.0 (2008-02-14 revision 15475) [i686-linux] real 0m32.840s user 0m32.560s sys 0m0.030s rb_reg_quote の返した文字列のエンコーディングが ASCII-8BIT で、 キャッシュの Regexp のエンコーディングが US-ASCII で食い違って いるため、キャッシュの Regexp が再利用されないようです。 -- Yusuke ENDOH