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

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

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

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

# なおruby1.8系の話です。他は知りません。


結論としては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が走ってコードになっている。

SunnySunny2013/01/14 00:37Super informative wirintg; keep it up.

zrhkcfzrhkcf2013/01/15 03:4979YDTG , [url=http://igkfglrxpcyh.com/]igkfglrxpcyh[/url], [link=http://qexjacxbevcl.com/]qexjacxbevcl[/link], http://chfplbugccdl.com/

jnmjptjnmjpt2013/01/16 11:06gA0l4Y <a href="http://pglnaastqkub.com/">pglnaastqkub</a>

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