Toshです。

In message "[ruby-list:20323] Re: RD with method index (again)"
    on 00/01/21, Minero Aoki <aamine / dp.u-netsurf.ne.jp> writes:
>> う〜む、なるほど。わかりました、なかなかそう簡単にもいかないのですね。
>> Stringのメソッド呼ぶ毎にメソッド呼出のコストが2倍くらいになるとなかな
>> か無視もできないかんじですね。
>
>2 倍じゃないんですよ。
>メソッド呼びだし 2 回、インスタンス変数アクセス 1 回、
>配列生成 1 回、多重代入 1 回増えるのでたぶん 4〜5 倍、
>もしかすると 10 倍以上です。試したことはないですけどね。

ああっ、そうか。

>と言ってる間に試しました。10万回呼びだしで
>
>  bare: 0.3 sec
>  delegate: 1.7 sec
>
>でした。この結果を「6.3 倍も遅い!」と見るか、
>「委譲したって 1.4 秒/10万回しかかわらない」と見るかは
>それぞれですけど、今回は一番スピード要求がシビアな
>next_token 内で結構呼びだしがあるから難しいですね。
>
># 逆に、普段のプログラムでは「委譲しても遅くならない?」なんて
># 悩む必要は全然ないということがはっきりわかりますね…

確かに今回の場合には、最も基本的なStringクラスをまるごと置き換えようと
してるのでちょっとつらそうですね。

>> 今のRubyはStringのサブクラスってインスタンス変数持てるんでしたっけ?
>持てます。
>
>> >というわけで、結局専用にクラスを作るのが一番いいかもしれません。
>> 
>> う〜ん、でもプリプロセッサの方も書き換えれば=begin ... =endの外の行数
>> もカウントできるのでは?IO#linenoだったら、特に何もしなくてもちゃんと
>> 行を返してくれそうですし。
>
>
>1 =begin
>2   エラーのあるテキストブロック
>3 =end
>4
>5 =begin
>6   上のテキストブロックの続き
>7
>8   next text
>9 =end
>
>という場合は 6 - 1 = 5 (2 が正解)になりません?

今のところ"=end ... =begin"をまたいでブロックを繋げることができません。
こういうブロックが繋がってしまうのはわかりづらいだろうと思ったので、
"=end ... =begin"はWHITELINEとみなされる、ことにしてます。
# あ、今気付いたけど、これだとリストとかは繋がっちゃう。
# BLANKLINEなくなったときに修正し忘れてました。

だから、この例の問題は起こらないはずです。

---
Tosh
Toshiro Kuwabara