前田です。

At Mon, 28 May 2001 13:18:27 +0900,
Tanaka Akira <akr / m17n.org> wrote:
> > Rubyレベルで見せるかどうかは別として、JavaのStringBufferのような
> > クラスを用意して、それを利用するようにした方がよいのではないでしょ
> > うか。
> 
> String 自体が StringBuffer のようなものであってもいいんじゃないでしょ
> うか。

そうですね。

> 後ろにどんどんつけ加えていく、というもっともありがちなケースを救うだけ
> なら String が(使っている領域ではなく)確保している領域のサイズを覚えて
> おけばいいと思うのですが。Array みたいに。

些細な問題としては、何らかのトリックで解決可能ですが、RString構造
体に使える領域が残っていないという問題がありますね。

> と思っているにもかかわらず、なぜ Array#join のほうを話題に出したかとい
> うと Array#join の改善は明らかに可能であるのに対し、String 自体の変更
> はどこまで波及するかわからなかったからです。でも明らかに可能だと思って
> いるにもかかわらず実際に変更を行なわなかった理由は、多言語化したときに
> String の連結がメモリ領域の単なる連結ではなくなるような事態もあるかも
> 知れない、と思ったからなんです。

現状のruby_m17nブランチでは、encodingをチェックした上で以前と同様
の処理を行っているようですね。
たぶん、多少変更されたとしても、連結後に必要なメモリ領域が連結前
よりも大く必要なのに変わりはないでしょうから、上記のような方法の
効果はあるのではないでしょうか。

問題は(実装とか、コードのメンテナンス性などをふくめた)コストに見
合うだけの効果があるかどうかですが、速度的にはかなりの効果が期待
できそうな気がします。

-- 
前田 修吾