yamazのRails日記 このページをアンテナに追加 RSSフィード

2010-05-12rubyのC拡張でzero copyなStringを取り回すのは難しい このエントリーを含むブックマーク

大量の文字列データ処理をする必要があって、pure rubyだといよいよきつくなってきたので、

C拡張で乗りきろうと思ったけど、いろいろあってうまくいかなかったのでその時のメモ。



結論としてはStringオブジェクトを作る際にzerocopy&CoWを期待してCレベルの文字列からrubyレベルのStringを作ろうとしても必ずしもzerocopyでStringを作れるとは限らないので思ったパフォーマンスは出ない可能性がある。


もうC++で解決したのだけど調査の際に色々分かったことを書いておく。



1. rubyStringはCからの利便性のため、内部の文字列には必ず\0がある.

オリジナルの文字列の終端に\0がない場合は強制的に\0を付与するため、その際にはmallocとmemcpyが発生する。


2. ある特定の条件のときにだけzerocopyでStringが作られる

この場合のある特定条件というのはよく分かってないが、1の事情があるので少なくとも文字列終端が\0で終わっている必要がある。


3. rubyStringにはCoW(Copy on Write)機能がある。

内部的にはzerocopyな文字列用のフラグ(?)があり,文字列にwriteが発生する時に始めてmallocが走ってコードになっている。

トラックバック - http://rubyist.g.hatena.ne.jp/yamaz/20100512