[前][次][番号順一覧][スレッド一覧][生データ]

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]