From: "NARUSE, Yui" Date: 2008-02-13T12:33:38+09:00 Subject: [ruby-dev:33730] Re: [ruby-cvs:22680] Ruby:r15443 (trunk): * bootstraptest/runner.rb, bootstraptest/test_method.rb, enc/depend, 成瀬です。 U.Nakamura wrote: > こんにちは、なかむら(う)です。 > > In message "[ruby-cvs:22680] Ruby:r15443 (trunk): * bootstraptest/runner.rb, bootstraptest/test_method.rb, enc/depend," > on Feb.12,2008 15:28:25, wrote: > | naruse 2008-02-12 15:28:23 +0900 (Tue, 12 Feb 2008) > | > | New Revision: 15443 > | > | Modified files: > | trunk/ChangeLog > | trunk/bootstraptest/runner.rb > | trunk/bootstraptest/test_method.rb > | trunk/enc/depend > | trunk/instruby.rb > | trunk/lib/mkmf.rb > | trunk/lib/test/unit/util/procwrapper.rb > | trunk/mkconfig.rb > | trunk/sample/test.rb > | trunk/template/vm.inc.tmpl > | trunk/test/ruby/test_stringchar.rb > | > | Log: > | * bootstraptest/runner.rb, bootstraptest/test_method.rb, enc/depend, > | instruby.rb, lib/mkmf.rb, lib/test/unit/util/procwrapper.rb, > | mkconfig.rb, sample/test.rb, template/vm.inc.tmpl, > | test/ruby/test_stringchar.rb: fixes arround String#gsub. > > この変更ですが、r15455で修正したように、少なくとも2点の誤りが > ありました。 > enc/dependの方は単なるtypoなのでいいですが、lib/mkmf.rbの方の > ような問題は、単にブロック内で$変数を使っている例を機械的に置 > 換したのであれば、他にも発生している可能性があると思います。 > r15454も含めると変更されたファイル数が膨大になるので個別の確 > 認はしていませんが、大丈夫なんでしょうか? う、気づきませんでした、再確認しておきます。ふと気付いたんですが、Ruby (というか鬼車) には \Q や \E ってないんですね。 > というか、動いてるものを大した用もないのに変更すんなとじっち > ゃんが言ってたんですが、これらの変更は必要な変更なんでしょう > か? 一つの理由は String#gsub のブロック引数の件が非互換の変更の方向で決着し た場合に備えて先回りしておこうと思ったからです。 もう一つが最適化です。String#gsub の文字列引数版は文字列を一回評価するだ けですが、ブロック引数版だと置換の度にブロックを評価するので、それなりに 違いが出ます。rexml や rdoc あたりだとアプリケーションレベルでも差が出る かなぁと思います。 例えば NetBSD4.0 Celeron 2.53GHz の場合で以下のような結果でした。 s = (0..0xff).to_a.pack('C*') * 40 Benchmark.bmbm { |b| b.report('block') { 10000.times{s.gsub(/\xff/){'a'}} } b.report('string'){ 10000.times{s.gsub(/\xff/, 'a')} } } Rehearsal ------------------------------------------ block 3.400000 0.000000 3.400000 ( 3.407861) string 2.250000 0.010000 2.260000 ( 2.273521) --------------------------------- total: 5.660000sec user system total real block 3.380000 0.010000 3.390000 ( 3.585447) string 2.250000 0.010000 2.260000 ( 2.269753) もっとも enc/depend あたりについては、不要と言われれば確かにそうかもしれ ません。 -- NARUSE, Yui DBDB A476 FDBD 9450 02CD 0EFC BCE3 C388 472E C1EA