[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によるオーバヘッドとかもありますしこんなものでは
ないかと思います.
まつもと ゆきひろ /:|)