From: Eric Hodel Date: 2011-07-07T07:26:18+09:00 Subject: [ruby-core:37835] Re: [Ruby 1.9 - Bug #4962] come back gem_prelude! On Jul 6, 2011, at 3:02 PM, Benoit Daloze wrote: > On 6 July 2011 23:21, Eric Hodel wrote: >> >> Please try r32429 > > I just tried, and here are some numbers. > Surprising how such a change can move numbers. > > $ time ruby -e '' > before: 0.045 > no-gems: 0.013 > after: 0.024 > > $ ruby -e 'p ObjectSpace.count_objects[:TOTAL]' > before: 20033 > no-gems: 9811 > after: 14308 I'm unsure if TOTAL is counting what we think it's counting. It seems to be showing the size of the object space not the number of allocated objects. If you add allocated and FREE from the output below you'll get TOTAL. $ cat diffhash.rb gems = eval `#{Gem.ruby} -e 'GC.start; p ObjectSpace.count_objects' | grep '{'` no_gems = eval `#{Gem.ruby} --disable-gems -e 'GC.start; p ObjectSpace.count_objects' | grep '{'` gems[:allocated] = gems.select { |k,_| k.to_s.start_with? 'T_' }.values.inject :+ no_gems[:allocated] = no_gems.select { |k,_| k.to_s.start_with? 'T_' }.values.inject :+ puts " gems no_gems diff" gems.keys.sort.each do |key| a = gems[key].to_i b = no_gems[key].to_i puts "%-10s %8d %8d %8d" % [key, a, b, a - b] end $ ./ruby19 diffhash.rb gems no_gems diff FREE 6793 7357 -564 TOTAL 14309 9811 4498 T_ARRAY 226 20 206 T_BIGNUM 3 3 0 T_CLASS 474 425 49 T_COMPLEX 1 1 0 T_DATA 347 117 230 T_FILE 3 3 0 T_FLOAT 7 7 0 T_HASH 7 3 4 T_ICLASS 19 18 1 T_MODULE 21 18 3 T_NODE 3185 27 3158 T_OBJECT 7 6 1 T_REGEXP 24 8 16 T_STRING 3192 1798 1394 allocated 7516 2454 5062 Also, the GC runs once at ruby startup: $ ruby19 --disable-gems -e 'GC::Profiler.enable; require "rubygems"; puts GC::Profiler.result' GC 1 invokes. Index Invoke Time(sec) Use Size(byte) Total Size(byte) Total Object GC Time(ms) 1 0.009 288200 409000 10225 0.41599999999999970335 Increasing HEAP_MIN_SLOTS to 20000 eliminates the initial garbage collection: $ RUBY_HEAP_MIN_SLOTS=20000 ruby19 --disable-gems -e 'GC::Profiler.enable; require "rubygems"; puts GC::Profiler.result' heap_min_slots=20000 (10000)