On 03.04.2007 08:07, bwv549 wrote:
> *** SUMMARY *** (for situations with gazillions of set-length
> objects):
> 1.  don't use objects--if you can, use arrays.  Faster and way leaner.
> 2.  If you have to use an object, struct seems like a good
> compromise.  Simple to use, fast, extendable, fast access by keywords,
> a little slow on object creation.  Significantly more memory than an
> array, but much less than a normal object.
> 3.  The ugly MyObject from above is probably best of you want faster
> initialization and plan to access mostly by index.  However, it's not
> implemented in any easy to create way. This is where someone with some
> meta-programming magic might be able to really clean things up...
> 4.  Avoid normal objects.  They take a long time to initialize and
> take up a lot of memory.

I am not sure I agree to your assessments about performance.  A class is 
actually the fastest if you omit the initialize definition.

Also, I am not sure whether your memory measurements are accurate: as 
far as I can see you do neither invoke GC.start (in order to try to 
force GC, which is an unreliable method anyway) nor GC.disable (in order 
to stop GC completely and thus be able to measure allocation).

Kind regards

	robert


09:58:18 [Temp]: ./create.rb
Rehearsal --------------------------------------------------
Struct           3.281000   0.000000   3.281000 (  3.360000)
Class            0.703000   0.000000   0.703000 (  0.840000)
Class (init)     6.375000   0.000000   6.375000 (  7.962000)
Class (init2)    7.203000   0.000000   7.203000 (  8.807000)
Array            1.016000   0.000000   1.016000 (  1.351000)
Array.new        0.812000   0.000000   0.812000 (  0.881000)
Array.new(5)     1.516000   0.000000   1.516000 (  1.890000)
OpenStruct       4.672000   0.000000   4.672000 (  5.969000)
---------------------------------------- total: 25.578000sec

                      user     system      total        real
Struct           2.687000   0.000000   2.687000 (  3.359000)
Class            0.797000   0.000000   0.797000 (  0.845000)
Class (init)     6.687000   0.000000   6.687000 (  7.929000)
Class (init2)    7.016000   0.000000   7.016000 (  8.815000)
Array            1.125000   0.000000   1.125000 (  1.347000)
Array.new        0.781000   0.000000   0.781000 (  0.875000)
Array.new(5)     1.547000   0.000000   1.547000 (  1.879000)
OpenStruct       4.750000   0.000000   4.750000 (  5.985000)
09:59:31 [Temp]: cat create.rb
#!/usr/bin/ruby

require 'ostruct'
require 'benchmark'
include Benchmark

St1 = Struct.new :f1, :f2, :f3, :f4, :f5

class St2; attr_accessor :f1, :f2, :f3, :f4, :f5; end

class St3
   attr_accessor :f1, :f2, :f3, :f4, :f5

   def initialize(f1=nil, f2=nil, f3=nil, f4=nil, f5=nil)
     @f1=f1
     @f2=f2
     @f3=f3
     @f4=f4
     @f5=f5
   end
end

class St4
   attr_accessor :f1, :f2, :f3, :f4, :f5

   def initialize(*a)
     @f1, @f2, @f3, @f4, @f5 = a
   end
end

REP = 1_000_000

bmbm(15) do |re|
   re.report("Struct") { REP.times { St1.new } }
   re.report("Class") { REP.times { St2.new } }
   re.report("Class (init)") { REP.times { St3.new } }
   re.report("Class (init2)") { REP.times { St4.new } }
   re.report("Array") { REP.times { [] } }
   re.report("Array.new") { REP.times { Array.new } }
   re.report("Array.new(5)") { REP.times { Array.new(5) } }
   re.report("OpenStruct") { REP.times { OpenStruct.new } }
end
09:59:33 [Temp]: