yarv-dev:677
From: SASADA Koichi <ko1 atdot.net>
Date: Tue, 25 Oct 2005 08:53:44 +0900
Subject: [yarv-dev:677] Re: mallocの回数 in st.c
ささだです。遅くなりました。 すみません、以下の方法よくわかりませんでした。 要するにオブジェクトのアロケーションのときに、必要な attirbute のため のスロットを確保しておく、ということでしょうか。 もしかしたら、もうちょっと一般的に、1 entry == 1 malloc じゃなくて、1 hash == 1 malloc な構造に変更する、とかありなのかも。 つまり、1 hash につき、ちょっと大きなメモリ領域を割り当てて、その中で 勝手にメモリ管理する。エントリが増えて realloc するときに、全コピーが発 生するからその点はまずそうだなぁ。 中村 wrote: > ささださんの日記で、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> -- SASADA Koichi at atdot dot net -- ML: yarv-dev quickml.atdot.net 使い方: http://www.atdot.net/~ko1/quickml
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]