あおきです。

  In mail "[ruby-list:20303] Re: RD with method index (again)"
    Toshiro Kuwabara <toshirok / yb3.so-net.ne.jp> wrote:

> Toshです。

> う〜む、なるほど。わかりました、なかなかそう簡単にもいかないのですね。
> 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 内で結構呼びだしがあるから難しいですね。

# 逆に、普段のプログラムでは「委譲しても遅くならない?」なんて
# 悩む必要は全然ないということがはっきりわかりますね…


> 今の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 が正解)になりません?
-------------------------------------------------------------------
あおきみねろう