Class: RubyProf::MethodInfo

Inherits:
Object
  • Object
show all
Includes:
Comparable
Defined in:
ext/ruby_prof/rp_method.c,
lib/ruby-prof/method_info.rb,
ext/ruby_prof/rp_method.c

Overview

The RubyProf::MethodInfo class stores profiling data for a method. One instance of the RubyProf::MethodInfo class is created per method called per thread. Thus, if a method is called in two different thread then there will be two RubyProf::MethodInfo objects created. RubyProf::MethodInfo objects can be accessed via the RubyProf::Result object.

Instance Method Summary collapse

Instance Method Details

#<=>(other) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
# File 'lib/ruby-prof/method_info.rb', line 7

def <=>(other)
  if self.total_time < other.total_time
    -1
  elsif self.total_time > other.total_time
    1
  elsif self.min_depth < other.min_depth
    1
  elsif self.min_depth > other.min_depth
    -1
  else
    self.full_name <=> other.full_name
  end
end

#aggregate_childrenObject



106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/ruby-prof/method_info.rb', line 106

def aggregate_children
  # Group call info's based on their targets
  groups = self.children.inject(Hash.new) do |hash, call_info|
    key = call_info.target
    (hash[key] ||= []) << call_info
    hash
  end

  groups.map do |key, value|
    AggregateCallInfo.new(value)
  end
end

#aggregate_parentsObject



93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/ruby-prof/method_info.rb', line 93

def aggregate_parents
  # Group call info's based on their parents
  groups = self.call_infos.inject(Hash.new) do |hash, call_info|
    key = call_info.parent ? call_info.parent.target : self
    (hash[key] ||= []) << call_info
    hash
  end

  groups.map do |key, value|
    AggregateCallInfo.new(value)
  end
end

#call_infosArray of call_info

Returns an array of call info objects that contain profiling information about the current method.

Returns:

  • (Array of call_info)


395
396
397
398
399
400
401
402
403
404
# File 'ext/ruby_prof/rp_method.c', line 395

static VALUE
prof_method_call_infos(VALUE self)
{
    prof_method_t *method = get_prof_method(self);
	if (method->call_infos->object == Qnil)
	{
		method->call_infos->object = prof_call_infos_wrap(method->call_infos);
	}
	return method->call_infos->object;
}

#calledObject



21
22
23
24
25
26
27
# File 'lib/ruby-prof/method_info.rb', line 21

def called
  @called ||= begin
    call_infos.inject(0) do |sum, call_info|
      sum += call_info.called
    end
  end
end

#childrenObject



85
86
87
88
89
90
91
# File 'lib/ruby-prof/method_info.rb', line 85

def children
  @children ||= begin
    call_infos.map do |call_info|
      call_info.children
    end.flatten
  end
end

#children_timeObject



56
57
58
59
60
61
62
63
# File 'lib/ruby-prof/method_info.rb', line 56

def children_time
  @children_time ||= begin
    call_infos.inject(0) do |sum, call_info|
      sum += call_info.children_time  unless call_info.recursive
      sum
    end
  end
end

#eliminate!Object

remove method from the call graph. should not be called directly.



124
125
126
127
128
# File 'lib/ruby-prof/method_info.rb', line 124

def eliminate!
  # $stderr.puts "eliminating #{self}"
  call_infos.each{ |call_info| call_info.eliminate! }
  call_infos.clear
end

#full_nameString

Returns the full name of this method in the format Object#method.

Returns:

  • (String)


383
384
385
386
387
388
# File 'ext/ruby_prof/rp_method.c', line 383

static VALUE
prof_full_name(VALUE self)
{
    prof_method_t *method = get_prof_method(self);
    return full_name(method->key->klass, method->key->mid);
}

#method_classObject

Returns the Ruby klass that owns this method.



334
335
336
337
338
339
# File 'ext/ruby_prof/rp_method.c', line 334

static VALUE
prof_method_klass(VALUE self)
{
    prof_method_t *result = get_prof_method(self);
    return result->key->klass;
}

#klass_nameString

Returns the name of this method’s class. Singleton classes will have the form <Object::Object>.

Returns:

  • (String)


358
359
360
361
362
363
# File 'ext/ruby_prof/rp_method.c', line 358

static VALUE
prof_klass_name(VALUE self)
{
    prof_method_t *method = get_prof_method(self);
    return klass_name(method->key->klass);
}

#line_noInteger

returns the line number of the method

Returns:

  • (Integer)


305
306
307
308
309
# File 'ext/ruby_prof/rp_method.c', line 305

static VALUE
prof_method_line(VALUE self)
{
    return rb_int_new(get_prof_method(self)->line);
}

#method_idObject

Returns the id of this method.



345
346
347
348
349
350
# File 'ext/ruby_prof/rp_method.c', line 345

static VALUE
prof_method_id(VALUE self)
{
    prof_method_t *result = get_prof_method(self);
    return ID2SYM(result->key->mid);
}

#method_nameString

Returns the name of this method in the format Object#method. Singletons methods will be returned in the format <Object::Object>#method.

Returns:

  • (String)


371
372
373
374
375
376
# File 'ext/ruby_prof/rp_method.c', line 371

static VALUE
prof_method_name(VALUE self)
{
    prof_method_t *method = get_prof_method(self);
    return method_name(method->key->mid);
}

#min_depthObject



65
66
67
68
69
# File 'lib/ruby-prof/method_info.rb', line 65

def min_depth
  @min_depth ||= call_infos.map do |call_info|
    call_info.depth
  end.min
end

#recursive?Boolean

Returns:

  • (Boolean)


79
80
81
82
83
# File 'lib/ruby-prof/method_info.rb', line 79

def recursive?
  call_infos.detect do |call_info|
    call_info.recursive
  end
end

#root?Boolean

Returns:

  • (Boolean)


71
72
73
74
75
76
77
# File 'lib/ruby-prof/method_info.rb', line 71

def root?
  @root ||= begin
    call_infos.find do |call_info|
      not call_info.root?
    end.nil?
  end
end

#self_timeObject



38
39
40
41
42
43
44
45
# File 'lib/ruby-prof/method_info.rb', line 38

def self_time
  @self_time ||= begin
    call_infos.inject(0) do |sum, call_info|
      sum += call_info.self_time  unless call_info.recursive
      sum
    end
  end
end

#source_fileString

return the source file of the method

Returns:

  • (String)


316
317
318
319
320
321
322
323
324
325
326
327
# File 'ext/ruby_prof/rp_method.c', line 316

static VALUE prof_method_source_file(VALUE self)
{
    const char* sf = get_prof_method(self)->source_file;
    if(!sf)
    {
      return rb_str_new2("ruby_runtime");
    }
    else
    {
      return rb_str_new2(sf);
    }
}

#to_sObject



119
120
121
# File 'lib/ruby-prof/method_info.rb', line 119

def to_s
  "#{self.full_name} (c: #{self.called}, tt: #{self.total_time}, st: #{self.self_time}, ct: #{self.children_time})"
end

#total_timeObject



29
30
31
32
33
34
35
36
# File 'lib/ruby-prof/method_info.rb', line 29

def total_time
  @total_time ||= begin
    call_infos.inject(0) do |sum, call_info|
      sum += call_info.total_time unless call_info.recursive
      sum
    end
  end
end

#wait_timeObject



47
48
49
50
51
52
53
54
# File 'lib/ruby-prof/method_info.rb', line 47

def wait_time
  @wait_time ||= begin
    call_infos.inject(0) do |sum, call_info|
      sum += call_info.wait_time unless call_info.recursive
      sum
    end
  end
end