From: "H.Yamamoto" Date: 2005-04-26T03:05:24+09:00 Subject: Re: profiler.rb Schroedinbug Hello. >This is AFAIk caused by rubygems which sets the RUBYOPT environment >variable so that it will always invoke -rubygems before anything else. I >think that debug, profiler, tracer and other libraries will then get >return events from the trace func for which there was no call event >which confuses them. Like this? Seems to solve both rubygems issue and [ruby-core:4782]. data[0] : how many times returned data[4] : how many times called # Sorry for [ruby-core:4782] patch. That didn't make any sense. Index: profiler.rb =================================================================== RCS file: /src/ruby/lib/profiler.rb,v retrieving revision 1.1 diff -u -w -b -p -r1.1 profiler.rb --- profiler.rb 20 Dec 2002 09:00:10 -0000 1.1 +++ profiler.rb 25 Apr 2005 17:58:24 -0000 @@ -6,10 +6,25 @@ module Profiler__ case event when "call", "c-call" now = Float(Times::times[0]) - @@stack.push [now, 0.0, id] + name = get_name(klass, id) + data = (@@map[name] ||= [0, 0.0, 0.0, name, 0]) + data[4] += 1 + @@stack.push [now, 0.0] when "return", "c-return" now = Float(Times::times[0]) + name = get_name(klass, id) + if (data = @@map[name]) && (data[0] < data[4]) tick = @@stack.pop + data[0] += 1 + cost = now - tick[0] + data[1] += cost + data[2] += cost - tick[1] + @@stack[-1][1] += cost + end + end + } +module_function + def get_name(klass, id) name = klass.to_s if name.nil? then name = '' end if klass.kind_of? Class @@ -18,23 +33,12 @@ module Profiler__ name += "." end name += id.id2name - data = @@map[name] - unless data - data = [0.0, 0.0, 0.0, name] - @@map[name] = data end - data[0] += 1 - cost = now - tick[0] - data[1] += cost - data[2] += cost - tick[1] - @@stack[-1][1] += cost - end - } -module_function + private :get_name def start_profile @@start = Float(Times::times[0]) - @@stack = [[0, 0, :toplevel], [0, 0, :dummy]] - @@map = {"#toplevel" => [1, 0, 0, "#toplevel"]} + @@stack = [[0.0, 0.0]] + @@map = {"#toplevel" => [1, 0.0, 0.0, "#toplevel", 1]} set_trace_func PROFILE_PROC end def stop_profile @@ -46,6 +50,7 @@ module_function if total == 0 then total = 0.01 end @@map["#toplevel"][1] = total data = @@map.values + data.delete_if{|a| a[0] != a[4]} data.sort!{|a,b| b[2] <=> a[2]} sum = 0 f.printf " %% cumulative self self total\n"