[ruby-list:45497] Re: _Re:_volatileの付け方

From: arton <artonx@...>
Date: 2008-09-11 16:37:54 UTC
List: ruby-list #45497
この質問についての回答がつかないようなので。

> ポインタに対して、
> 
>   p_foo = (VALUE *)ALLOC_N(VALUE, len);
> 
>   p_foo[0] = rb_class_new_instance(...);
>   p_foo[1] = rb_class_new_instance(...);
xmallocしたのはヒープなので自分でマークしなければだめだと思いました(う
む、自信ないや)。
したがって、rubikitchさんが書かれた方法を兼用して、
volatile VALUE* pary = rb_ary_new...
のようにすれば、スタック上(GCによって有効と判断される)のVALUE*に配列が
確保できるので安全です。ここで、volatileを付けないと最適化によっては、そ
のコードの位置でスタックに積まれないのでGCされてしまう可能性があるのは、
ご想像の通りです。

ただ、誤解していたら申し訳ありませんが、次のようにしたほうが高速で、かつ
簡単という可能性はありませんか?

1. Rubyから拡張ライブラリが呼ばれる(引数はArrayなのかな?)
2. 普通にCのプログラムとして配列を作って(int配列かdouble配列かはわかり
ませんが)、その配列に、Rubyから渡されたものをコピー(VALUEからintなどへ
の変換は必要ですが)する。(引数はスタックに積まれるので問題なし)
普通にCのプログラムで計算する。(ここに時間がかかるのだと想定しています)
3. 計算が終わったら、Ruby用にVALUEへ変換しながら書き戻す。

数日計算するほどの量だと、仮にFIXNUMだとしても、Cで計算可能な型に直すに
はビット演算(doubleだと関数呼び出し)が必要となるため、Cで書いてもそれ
ほど効果があるかは疑問です。つまり、Cの中ではあまりVALUEを利用しないです
ませるほうが、GCを気にしなくても構わないし、処理も高速だと思います。
--------------------------------------
Enjoy MLB with MAJOR.JP! Ichiro, Matsuzaka, Matsui, and more!
http://pr.mail.yahoo.co.jp/mlb/

In This Thread