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

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]