From: Yusuke ENDOH Date: 2010-03-08T23:22:27+09:00 Subject: [ruby-dev:40582] Re: [Feature #2833] 絵文字エンコーディングの提案 遠藤です。 2010年3月3日12:43 Yusuke ENDOH : > せめて、テーブル生成のスクリプトを高速化してからか、configure の > オプションでオフにできるようにしていただけないでしょうか。 文句言ってばかりなのも残念なので、自分で最適化してみました。 tool/transcode-tblgen.rb を書き換えてから make にかかる時間が no-opt -> opt 絵文字パッチ前: 133 秒 -> 124 秒 絵文字パッチ後: 275 秒 -> 151 秒 となりました。 絵文字パッチのせいで従来より 142 秒ビルドが遅くなっていたところを、 18 秒遅くなるだけになりました。これなら許容範囲かなと思います。 (元々が遅すぎるという話はありますが) 導入した最適化は以下の 2 つです。 1) [byte..byte] の使いまわし [byte..byte] というオブジェクトが大量に作られていた (しかも破壊的 変更はされない) ので、使いまわすようにしました。 2) memoize の改良 PostMemo にヒットしたとき PreMemo を更新していなかったので、更新 するようにしました。 生成されるプログラムに変化はないようです。 小さい配列やハッシュを大量に生成し、(memoize のために) それらへの 参照を消さないプログラムなので、GC が結構時間を食っているようです。 GC の最適化の題材に良いかもしれません。 diff --git a/tool/transcode-tblgen.rb b/tool/transcode-tblgen.rb index f8da86d..4f183f1 100755 --- a/tool/transcode-tblgen.rb +++ b/tool/transcode-tblgen.rb @@ -23,6 +23,8 @@ HEX2 = /[0-9A-Fa-f]{2}/ class StrSet attr_reader :pat + SINGLE_BYTE_RANGES = (0..255).map {|i| [i..i] } + def self.parse(pattern) if /\A\s*((#{HEX2}|\{(#{HEX2}|#{HEX2}-#{HEX2})(,(#{HEX2}|#{HEX2}-#{HEX2}))*\})+(\s+|\z))*\z/o !~ pattern raise ArgumentError, "invalid pattern: #{pattern.inspect}" @@ -33,7 +35,7 @@ class StrSet while !seq.empty? if /\A(#{HEX2})/o =~ seq byte = $1.to_i(16) - seq_result << [byte..byte] + seq_result << SINGLE_BYTE_RANGES[byte] seq = $' elsif /\A\{([^\}]+)\}/ =~ seq set = $1 @@ -448,7 +450,7 @@ End } if n = PostMemo[table] - return n + return PreMemo[[self,valid_encoding]] = n end if !name_hint -- Yusuke ENDOH