From: Toshiro Kuwabara Date: 2000-01-06T00:47:48+09:00 Subject: [ruby-list:20064] Re: RD with method index (again) Toshです。 In message "[ruby-list:20060] Re: RD with method index (again)" on 00/01/05, Minero Aoki writes: >ところで衝突の方ですが、原因はメッセージに出てるとおり rule 30 35 40 です。 >おそらくトップレベルのリストに対応するためだと思うんですが、 >これが入っていることで > >* first >* second > >のような場合に first,second ふたつの項目をもつリストなのか、 >first のなかにネストしたリスト second が入っているのか区別が >できなくなります。 >(ただ、衝突するとシフトが優先なので結果としてはうまくいってます。 > 安心してていいのかは知らないんですけど…) ここまでは、把握してました。 # とりあえず動いてるからいいや〜、と。(^^;; >真面目に解消するとしたら、enumlist: enumlistitems とかをやめて、 >INDENT が必要なところと不要なところをきりわけるのがよいんでないかと >思います。 む、なるほど。ちょっといじってみます。 >試してみました。確かに ruby-man.rd は時間かかりますね。 >celeron333A + 128MB で 11秒弱でした。 >profile.rb で調べてみると、 > > % cumulative self self total > time seconds seconds calls ms/call ms/call name > 19.68 84.72 84.72 19016 4.46 6.86 RD::RDParser#next_token > 11.79 135.47 50.75 14774 3.44 21.04 Array#each > 8.50 172.05 36.58 117051 0.31 0.31 Regexp#=== > 5.69 196.57 24.52 1 24516.67 36866.67 RD::RDTree#preprocess > 4.76 217.05 20.48 1720 11.91 176.71 Racc::Parser#_c_parse > 3.81 233.45 16.40 1721 9.53 373.27 RD::RDInlineParser#parse > 3.67 249.27 15.82 8698 1.82 23.17 RD::Verbatim#each_element > 3.10 262.63 13.37 45465 0.29 0.29 Hash#[] > 3.04 275.73 13.10 2593 5.05 7.77 RD::RDParser#cut_off > 2.99 288.60 12.87 40567 0.32 0.32 Array#push >(以下略) > >という結果になりました。 >やはり next_token を中心とするスキャン系統が圧倒的に時間かかってますね。 >とりあえず、next_token が遅い原因は文字列埋めこみの正規表現ですね。 >これを \s+ と currentIndent == $1 とかに直せば多少速くなるんでは? あ、そうですね。どうもありがとうございます。 前のメールで指摘して頂いた部分だけで10%弱のスピードアップが実現 できました。 # 結構Arrayの生成とかばかにできないコストみたいですね。 # ついでにGC.disableであと10%くらい早くなるみたいですが、これは # ちょっと反則っぽいのでなしですね。 >あとは、block-parser と inline-parser をひとつにまとめるとか、 >ファイルを配列でなく文字列に読みこんで strscan でスキャンするとか… >(荒技だ。) う〜ん。block-parserとinline-parserで分けているのが「1つだとうまく いかなかったので」という事情なのでできるかどうか。 # インデントが重要なのでそこらへんの処理の仕方がなんか難しそうだった # のだと思います。 block-parserはほとんど行がトークンになるので、こうしておくとstrscan 使わなくてもそこそこのスピードでスキャンできるというおまけもありますが。 --- Tosh Toshiro Kuwabara