> But, you still wouldn't have to store the class info for
each
> element. I'm not sure of the underlying Ruby object data
> structure, but at a minimum, it should get rid of a pointer
(to
> the class) per element. I think you'd have to implement
this
> in C to do it right.I don't think it's worth the effort. That must be a very
special case where
you need huge collections of inhomogenous data where you want
to squeeze out
every byte. I can't think of an application of this. Plus,
it'll be error
prone and very inefficient.
I just did some memory measurements to see how much various
things take up. I tested a million objects using this:
ruby -e 'mem0 = `ps -p #{Process.pid} -o rsz`.
split("\n")[1].to_i; a=Array.new(2**20);a.each_index{|i|
a[i]=<object> };mem1 = `ps -p #{Process.pid} -o rsz`.
split("\n")[1].to_i; puts(((mem1-mem0)/1024.0).to_s+"MB")'
Here are some results (object ref + object):
bytes object
----- ------
4 nil,false,true,Fixnum
30 String 0-1 characters
46 String 2-11 characters
54 String 12-19 characters (+8 bytes per +8 characters)
30 Float
30 Array 0 nil entries
46 Array 1-3 nil entries
54 Array 4-5 nil entries (+8 bytes per +2 entries)
102 Hash empty
126 Hash 1 Fixnum=>nil entry (+24 bytes per +1 entry)
These overheads look pretty large to me. That 30 byte overhead
(includes 4-byte object ref) is quite dominate for many cases.
In C, the overhead would be 12 bytes for strings and arrays
(pointer, length, malloc entry). An array of strings/arrays
where each had a fixed length could be implemented with an
overhead of 4 bytes (an index into a concatenated
string/array). An array of fixed length strings/arrays could
be implemented with no overhead per entry. Maybe it is worth
it to handle these last 2 cases (could be done in Ruby easily),
but not the completely variable length case (would probably
need C).
ยทยทยท
__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around