[ruby-list:490] Re: memory size

From: matz@... (Yukihiro Matsumoto)
Date: 1996-09-04 07:45:34 UTC
List: ruby-list #490
まつもと ゆきひろです.

In message "[ruby-list:488] Re: memory size"
    on 96/09/04, 石塚圭樹 <keiju@shljapan.co.jp> writes:
|
|けいじゅ@SHLジャパンです. 

|そうですか. でもその方が好都合かも...
|
|というのも, 今のrubyには配列やハッシュ表をあるサイズで生成することがで
|きませんよね.  どうせそのサイズになると分かっているのなら, そのサイズ
|が前もって指定できた方が効率的だと思うのですが?

そうですねえ.Cからはできてもrubyからはできないですね.

  Array.new(40)

とかでも用意しますか.

|>普通のobject
|>
|>  インスタンス変数が無い時 = 20 byte
|>  インスタンス変数がある時 ≒ 48 + 12*変数の数 + 4*変数の数/3 byte
|
|内部では, ハッシュ表を使っているという話しでしたからね... 今は, シンボ
|ルとかもありますし, メンバ=クラス毎のシンポルですからsequence に id を
|割り振ることもできると思うのですが...

そうでもないんですよ.普通の言語は同じクラスのオブジェクトは
同じ構造(同じインスタンス変数群)を持ちますが,インスタンス変
数の宣言の無いrubyでは,使われていないインスタンス変数は存在
せず,同じクラスのインスタンスでも持っているインスタンス変数
が違うことがありえます.

つーわけで sequentialに割り当てるというのは採用できません.
もっとも,一般にインスタンス変数の数は少ないことが多いですし,
線形検索した方が良いのかも知れません.しかし,新しい変数を使
う度にreallocというのも嬉しくないような….

|>こうしてみるとハッシュテーブルを持つものの大きさが馬鹿になり
|>ませんね.ちょっと見直しの余地があるかなあ.

あ,そうそう.今ちょっとst.cを変更してハッシュテーブルのサイ
ズを28byteから20byteにまで減らしました.これで1オブジェクト
あたり8yteの節約になりますね.

|忘れていた. fixnum/bignumも教えて下さい.

fixnum

  4byte

bignum

  20 + 16bitでの桁数*2 byte

|30000オブジェクトで1オブジェクト8インスタンス変数ですから:   約4.6MB
|1オブジェクトあたり文字列が15/8/10/10のサイズがありますから: 約4.0MB
|あと, 最終的に30000オブジェクトはいるハッシュ表が2つで:      約1.OMB
|
|合計 約10MB でその他にもオブジェクトをかなり生成しているので実プロセス
|サイズが 14MBになるのもそれほど変ではない?? 1.4倍の差は大きいという話
|しもあるが...

まあ,mallocによるオーバヘッドとかもありますしこんなものでは
ないかと思います.

                                まつもと ゆきひろ /:|)

In This Thread

Prev Next