yarv-dev:676
From: 中村 <wo_atmark s9.dion.ne.jp>
Date: Mon, 17 Oct 2005 21:53:25 +0900
Subject: [yarv-dev:676] mallocの回数 in st.c
ML: yarv-dev quickml.atdot.net
新メンバー: wo_atmark@s...
はじめまして、中村というものです。
Rubyはあまりよくわからないのですが、VMまわりに興味があったので、ROMしてました。
ささださんの日記で、mallocの回数について触れられていたのですが、
アロケート回数を減らす工夫は結構好きなので、ちょっと考えてみたところ、
st_table_entryの割り当て部分でmallocの回数を減らせるんじゃないかと
思ったので、少し書いてみます。
まず、Rubyのインスタンス変数割り当ては以下のようになっているはずです
動作を追ったわけではないので、間違っていたらすいません。
- rb_ivar_set()呼び出し
- st_insert()呼び出し
- エントリが見つからなかったらエントリを割り当てる
この通りの動作であれば、エントリ(st_table_entry)の
割り当てのたびに、mallocが呼ばれているはずです。
ですが、Rubyの場合、必要なエントリの数は、クラスの構文解析が終わった時点で、
@nameの数を数えれば大体わかるはずなので、
この部分をうまくやれば、mallocの回数を減らせるのでは?と、考えました。
具体的には、次の方法で可能なはずです。
- クラスの構文解析、もしくはコンパイル時に、@nameの数を数える。
@nameには順番にインデックスを割り当てていく
- クラスオブジェクトに、{name => nameのインデックス}
のマップ情報を持たせておく
(これをid_entry_idx_mapとしておく)
- st_tableを
struct st_table
struct st_table {
struct st_hash_type *type;
int num_bins;
int num_entries;
struct st_table_entry **bins;
struct st_table_entry entries[1];
};
と、しておく
- rb_ivar_set() で case T_OBJECT で st_init_numtable しているところを、
オブジェクトのクラスから、必要なエントリ数を調べて、
その分を余計に確保するように変更する。
- st_insert だけでなく、T_OBJECTの場合に特化した st_insert_object
のようなものを用意して、st_insert_objectを次のようにする
1. FIND_ENTRYして、見つかったらそのエントリに設定、終了。
2. 見つからなかった場合は、そのオブジェクトのクラスの
id_entry_idx_mapから、IDのインデックスを調べる
3. id_entry_idx_mapに見つからなかった場合は、mallocでエントリを割り当てる
4. 見つかった場合は、st_tableのentriesからエントリを割り当てる
これで、rb_ivar_setした場合のmallocの回数を減らせるかと思います。
この方法は、
- クラス定義が遅くなる。
→ id_entry_idx_mapの作成
→ 親オブジェクトの id_entry_idx_map のコピー。
- 使わないインスタンス変数があっても、エントリが作られる
- st_free_tableが遅くなる。
→ なんらかの方法でエントリをfree()するかどうかの判定が必要になる
と、いう短所があるのですが、大量にオブジェクトを割り当てた場合に、
mallocの回数を大量に減らせると思うので、短所を上回るだけの
効果はあるかと思います。
いかがでしょうか。
--
中村孝史<wo_atmark s9.dion.ne.jp>
--
ML: yarv-dev quickml.atdot.net
使い方: http://www.atdot.net/~ko1/quickml
このMLを退会する方法:
- 本文が空のメールを <yarv-dev quickml.atdot.net> に送ってください
- 本文が空のメールを送れない場合は、
本文に「退会」とだけ書いたメールを <yarv-dev quickml.atdot.net> に送ってください
(署名やhotmailの広告などがついて空メールを送れない場合など)
<yarv-dev quickml.atdot.net> のメンバー:
ko1@a...
aamine@l...
babie7a0@y...
cv8t-hdk@a...
fukumori@m...
gotoyuzo@n...
iga@r...
ikoma@m...
kawaji@h...
kou@c...
kumaryu@k...
maeda-yarv@a...
makoto.nakagawa@h...
masato@c...
matz@r...
nobsun@s...
nobu.nakada@n...
sakai@t...
shudo@c...
shugo@r...
usa@g...
yuya-ml@4...
zn@m...
nobu.nokada@s...
hira@v...
dan@d...
ml@a...
i@c...
akr@m...
nebata1953t@y...
shimada_pcml@y...
g-stuff@b...
zb@u...
shiro@l...
ttate@t...
nnakamur@m...
tom@n...
oxy@k...
ats7@a...
sheepman@s...
wo_atmark@s...
-> 676 2005-10-17 21:53 [wo_atmark s9.dion.ne] mallocの回数 in st.c 677 2005-10-25 08:53 ┗[ko1 atdot.net ] 678 2005-10-25 21:50 ┗[wo_atmark s9.dion.ne]