2010-05-12rubyのC拡張でzero copyなStringを取り回すのは難しい

大量の文字列データ処理をする必要があって、pure rubyだといよいよきつくなってきたので、
C拡張で乗りきろうと思ったけど、いろいろあってうまくいかなかったのでその時のメモ。
結論としてはStringオブジェクトを作る際にzerocopy&CoWを期待してCレベルの文字列からrubyレベルのStringを作ろうとしても必ずしもzerocopyでStringを作れるとは限らないので思ったパフォーマンスは出ない可能性がある。
もうC++で解決したのだけど調査の際に色々分かったことを書いておく。
1. rubyのStringはCからの利便性のため、内部の文字列には必ず\0がある.
オリジナルの文字列の終端に\0がない場合は強制的に\0を付与するため、その際にはmallocとmemcpyが発生する。
2. ある特定の条件のときにだけzerocopyでStringが作られる
この場合のある特定条件というのはよく分かってないが、1の事情があるので少なくとも文字列終端が\0で終わっている必要がある。
3. rubyのStringにはCoW(Copy on Write)機能がある。
内部的にはzerocopyな文字列用のフラグ(?)があり,文字列にwriteが発生する時に始めてmallocが走ってコードになっている。
コメントを書く
トラックバック - http://rubyist.g.hatena.ne.jp/yamaz/20100512