From 38e80b999f79817fc7383477211d9730eb118487 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 22 Aug 2013 09:01:30 +1000 Subject: [PATCH] benching script, work in progress --- script/measure.rb | 126 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 script/measure.rb diff --git a/script/measure.rb b/script/measure.rb new file mode 100644 index 000000000..e4fa161d0 --- /dev/null +++ b/script/measure.rb @@ -0,0 +1,126 @@ +# using this script to try figure out why Rails 2 is slower that 1.9 +# +require 'objspace' +require 'benchmark' +require 'ruby-prof' + +require File.expand_path(File.dirname(__FILE__) + "/../config/environment") + + +def profile_allocations(name) + GC.disable + initial_size = ObjectSpace.count_objects + yield + changes = ObjectSpace.count_objects + changes.each do |k,v| + changes[k] -= initial_size[k] + end + puts "#{name} changes" + changes.sort{|a,b| b[1] <=> a[1]}.each do |a,b| + next if b <= 0 + # 1 extra hash for tracking + puts "#{a} #{a == :T_HASH ? b-1 : b}" + end + GC.enable +end + +def profile(name, &block) + puts "Profiling all object allocation for #{name}" + GC.start + GC.disable + + items = [] + objs = [] + + ObjectSpace.trace_object_allocations do + block.call + + ObjectSpace.each_object do |o| + objs << o + end + + objs.each do |o| + g = ObjectSpace.allocation_generation(o) + if g + l = ObjectSpace.allocation_sourceline(o) + f = ObjectSpace.allocation_sourcefile(o) + c = ObjectSpace.allocation_class_path(o) + m = ObjectSpace.allocation_method_id(o) + items << "Allocated #{c} in #{m} #{f}:#{l}" + end + end + end + + items.group_by{|x| x}.sort{|a,b| b[1].length <=> a[1].length}.each do |row, group| + puts "#{row} x #{group.length}" + end + + GC.enable + profile_allocations(name, &block) +end + + +# User.limit(10).to_a +# RubyProf.start +# User.limit(10).to_a +# result = RubyProf.stop +# # printer = RubyProf::GraphPrinter.new(result) +# printer = RubyProf::FlatPrinter.new(result) +# printer.print(STDOUT, :min_percent => 2) +# +# exit +# +# # User.limit(10).to_a +# User.limit(10).select(:created_at).to_a +# +# profile("limit 10") do +# User.limit(10).select(:created_at).to_a +# end +# +# exit +# User.limit(10).to_a +# exit +# +User.select('id, 2 bob').first +Benchmark.bmbm do |x| + + x.report("find") do + 100.times{User.find(1)} + end + + x.report("grab 10 users created_at") do + 100.times{User.limit(10).select(:created_at).to_a} + end + + x.report("grab 10 users id") do + 100.times{User.limit(10).select(:id).to_a} + end + + x.report("grab 10 users") do + 100.times{User.limit(10).to_a} + end + + + x.report("pg direct grab 10 users") do + 100.times do + r = ActiveRecord::Base.connection.raw_connection.async_exec("select * from users limit 10") + r.fields.each_with_index do |f,i| + r.ftype(i) + end + r.each_row do |x| + x + end + end + end + +end + + +# profile("find") do +# User.find(1) +# end +# puts +# profile("where") do +# User.where(id: 1).first +# end +