Forum: Ruby New Profiler.

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
John C. (Guest)
on 2006-03-24 06:55
(Received via mailing list)
One of the rules of optimizing OO programs is to create less objects.

Like a Good Green Environmentalist, you should Reduce, Recycle & Reuse.

The next question is what objects are being created.

My memory profiler I posted last year tells you that...
   http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/...

It digs into ObjectSpace and sees what objects are currently alive.


Very good for reducing the memory footprint, but not much use for
decreasing garbage collection.

So, here is my nifty NewProfiler which tells where what class of object
is
being created....


http://www.rubygarden.org/ruby?NewProfiler

Just slap this code at the head of program and run...

class Class
   alias_method :orig_new, :new

   @@count = 0
   @@stoppit = false
   @@class_caller_count = Hash.new{|hash,key| hash[key] = Hash.new(0)}

   def new(*arg,&blk)
     unless @@stoppit
       @@stoppit = true
       @@count += 1
       @@class_caller_count[self][caller[0]] += 1
       @@stoppit = false
     end
     orig_new(*arg,&blk)
   end

   def Class.report_final_tally
     @@stoppit = true
     puts "Number of objects created = #{@@count}"

     total = Hash.new(0)

     @@class_caller_count.each_key do |klass|
       caller_count = @@class_caller_count[klass]
       caller_count.each_value do |count|
         total[klass] += count
       end
     end

     klass_list = total.keys.sort{|klass_a, klass_b|
       a = total[klass_a]
       b = total[klass_b]
       if a != b
         -1* (a <=> b)
       else
         klass_a.to_s <=> klass_b.to_s
       end
     }
     klass_list.each do |klass|
       puts "#{total[klass]}\t#{klass} objects created."
       caller_count = @@class_caller_count[ klass]
       caller_count.keys.sort_by{|call| -1*caller_count[call]}.each do
|call|
         puts "\t#{call}\tCreated #{caller_count[call]} #{klass}
objects."
       end
       puts
     end
   end
end

END {
   b = String.new
   Class.report_final_tally
}



John C.                             Phone : (64)(3) 358 6639
Tait Electronics                        Fax   : (64)(3) 359 4632
PO Box 1645 Christchurch                Email : 
removed_email_address@domain.invalid
New Zealand

Carter's Clarification of Murphy's Law.

"Things only ever go right so that they may go more spectacularly wrong
later."

From this principle, all of life and physics may be deduced.
This topic is locked and can not be replied to.