ruby-prof 1.1.0-x64-mingw32 → 1.3.0-x64-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +19 -1
  3. data/bin/ruby-prof +100 -152
  4. data/ext/ruby_prof/rp_aggregate_call_tree.c +59 -0
  5. data/ext/ruby_prof/rp_aggregate_call_tree.h +13 -0
  6. data/ext/ruby_prof/rp_allocation.c +67 -59
  7. data/ext/ruby_prof/rp_allocation.h +3 -3
  8. data/ext/ruby_prof/rp_call_tree.c +369 -0
  9. data/ext/ruby_prof/rp_call_tree.h +43 -0
  10. data/ext/ruby_prof/rp_call_trees.c +288 -0
  11. data/ext/ruby_prof/rp_call_trees.h +28 -0
  12. data/ext/ruby_prof/rp_measure_allocations.c +11 -13
  13. data/ext/ruby_prof/rp_measure_process_time.c +11 -13
  14. data/ext/ruby_prof/rp_measure_wall_time.c +17 -15
  15. data/ext/ruby_prof/rp_measurement.c +47 -40
  16. data/ext/ruby_prof/rp_measurement.h +7 -7
  17. data/ext/ruby_prof/rp_method.c +116 -255
  18. data/ext/ruby_prof/rp_method.h +31 -39
  19. data/ext/ruby_prof/rp_profile.c +311 -281
  20. data/ext/ruby_prof/rp_profile.h +1 -2
  21. data/ext/ruby_prof/rp_stack.c +113 -105
  22. data/ext/ruby_prof/rp_stack.h +17 -20
  23. data/ext/ruby_prof/rp_thread.c +136 -111
  24. data/ext/ruby_prof/rp_thread.h +12 -9
  25. data/ext/ruby_prof/ruby_prof.c +27 -23
  26. data/ext/ruby_prof/ruby_prof.h +9 -0
  27. data/ext/ruby_prof/vc/ruby_prof.vcxproj +11 -7
  28. data/lib/ruby-prof.rb +2 -3
  29. data/lib/ruby-prof/assets/call_stack_printer.html.erb +4 -7
  30. data/lib/ruby-prof/assets/graph_printer.html.erb +5 -6
  31. data/lib/ruby-prof/{call_info.rb → call_tree.rb} +6 -6
  32. data/lib/ruby-prof/call_tree_visitor.rb +36 -0
  33. data/lib/ruby-prof/measurement.rb +5 -2
  34. data/lib/ruby-prof/method_info.rb +3 -15
  35. data/lib/ruby-prof/printers/call_info_printer.rb +12 -10
  36. data/lib/ruby-prof/printers/call_stack_printer.rb +19 -22
  37. data/lib/ruby-prof/printers/call_tree_printer.rb +1 -1
  38. data/lib/ruby-prof/printers/dot_printer.rb +3 -3
  39. data/lib/ruby-prof/printers/graph_printer.rb +3 -4
  40. data/lib/ruby-prof/printers/multi_printer.rb +2 -2
  41. data/lib/ruby-prof/rack.rb +3 -0
  42. data/lib/ruby-prof/thread.rb +3 -18
  43. data/lib/ruby-prof/version.rb +1 -1
  44. data/ruby-prof.gemspec +7 -0
  45. data/test/alias_test.rb +42 -45
  46. data/test/basic_test.rb +0 -86
  47. data/test/{call_info_visitor_test.rb → call_tree_visitor_test.rb} +6 -5
  48. data/test/call_trees_test.rb +66 -0
  49. data/test/exclude_methods_test.rb +17 -12
  50. data/test/fiber_test.rb +197 -9
  51. data/test/gc_test.rb +36 -42
  52. data/test/inverse_call_tree_test.rb +175 -0
  53. data/test/line_number_test.rb +67 -70
  54. data/test/marshal_test.rb +7 -11
  55. data/test/measure_allocations_test.rb +224 -234
  56. data/test/measure_allocations_trace_test.rb +224 -234
  57. data/test/measure_memory_trace_test.rb +814 -469
  58. data/test/measure_process_time_test.rb +0 -64
  59. data/test/measure_times.rb +2 -0
  60. data/test/measure_wall_time_test.rb +34 -58
  61. data/test/pause_resume_test.rb +19 -10
  62. data/test/prime.rb +1 -3
  63. data/test/prime_script.rb +6 -0
  64. data/test/printers_test.rb +1 -1
  65. data/test/recursive_test.rb +50 -54
  66. data/test/start_stop_test.rb +19 -19
  67. data/test/test_helper.rb +3 -15
  68. data/test/thread_test.rb +11 -11
  69. data/test/unique_call_path_test.rb +25 -95
  70. metadata +19 -10
  71. data/ext/ruby_prof/rp_call_info.c +0 -271
  72. data/ext/ruby_prof/rp_call_info.h +0 -35
  73. data/lib/2.6.5/ruby_prof.so +0 -0
  74. data/lib/ruby-prof/call_info_visitor.rb +0 -38
  75. data/test/parser_timings.rb +0 -24
@@ -8,14 +8,14 @@
8
8
  #include "rp_stack.h"
9
9
 
10
10
  /* Profiling information for a thread. */
11
- typedef struct
11
+ typedef struct thread_data_t
12
12
  {
13
13
  // Runtime
14
14
  VALUE object; /* Cache to wrapped object */
15
15
  VALUE fiber; /* Fiber */
16
16
  prof_stack_t* stack; /* Stack of frames */
17
17
  bool trace; /* Are we tracking this thread */
18
-
18
+ prof_call_tree_t* call_tree; /* The root of the call tree*/
19
19
  VALUE thread_id; /* Thread id */
20
20
  VALUE fiber_id; /* Fiber id */
21
21
  VALUE methods; /* Array of RubyProf::MethodInfo */
@@ -23,13 +23,16 @@ typedef struct
23
23
  } thread_data_t;
24
24
 
25
25
  void rp_init_thread(void);
26
- st_table * threads_table_create(void);
27
- thread_data_t *threads_table_lookup(void *profile, VALUE fiber);
28
- thread_data_t* threads_table_insert(void *profile, VALUE fiber);
29
- void switch_thread(void *profile, thread_data_t *thread_data, double measurement);
30
- void threads_table_free(st_table *table);
31
- VALUE prof_thread_wrap(thread_data_t *thread);
32
- void prof_thread_mark(void *data);
26
+ st_table* threads_table_create(void);
27
+ thread_data_t* threads_table_lookup(void* profile, VALUE fiber);
28
+ thread_data_t* threads_table_insert(void* profile, VALUE fiber);
29
+ void threads_table_free(st_table* table);
30
+
31
+ thread_data_t* prof_get_thread(VALUE self);
32
+ VALUE prof_thread_wrap(thread_data_t* thread);
33
+ void prof_thread_mark(void* data);
34
+
35
+ void switch_thread(void* profile, thread_data_t* thread_data, double measurement);
33
36
  int pause_thread(st_data_t key, st_data_t value, st_data_t data);
34
37
  int unpause_thread(st_data_t key, st_data_t value, st_data_t data);
35
38
 
@@ -1,34 +1,36 @@
1
1
  /* Copyright (C) 2005-2019 Shugo Maeda <shugo@ruby-lang.org> and Charlie Savage <cfis@savagexi.com>
2
2
  Please see the LICENSE file for copyright and distribution information */
3
3
 
4
- /* ruby-prof tracks the time spent executing every method in ruby programming.
5
- The main players are:
6
-
7
- profile_t - This represents 1 profile.
8
- thread_data_t - Stores data about a single thread.
9
- prof_stack_t - The method call stack in a particular thread
10
- prof_method_t - Profiling information about each method
11
- prof_call_info_t - Keeps track a method's callers and callees.
12
-
13
- The final result is an instance of a profile object which has a hash table of
14
- thread_data_t, keyed on the thread id. Each thread in turn has a hash table
15
- of prof_method_t, keyed on the method id. A hash table is used for quick
16
- look up when doing a profile. However, it is exposed to Ruby as an array.
17
-
18
- Each prof_method_t has two hash tables, parent and children, of prof_call_info_t.
19
- These objects keep track of a method's callers (who called the method) and its
20
- callees (who the method called). These are keyed the method id, but once again,
21
- are exposed to Ruby as arrays. Each prof_call_into_t maintains a pointer to the
22
- caller or callee method, thereby making it easy to navigate through the call
23
- hierarchy in ruby - which is very helpful for creating call graphs.
24
- */
4
+ /* ruby-prof tracks the time spent executing every method in ruby programming.
5
+ The main players are:
6
+
7
+ profile_t - This represents 1 profile.
8
+ thread_data_t - Stores data about a single thread.
9
+ prof_stack_t - The method call stack in a particular thread
10
+ prof_method_t - Profiling information about each method
11
+ prof_call_tree_t - Keeps track a method's callers and callees.
12
+
13
+ The final result is an instance of a profile object which has a hash table of
14
+ thread_data_t, keyed on the thread id. Each thread in turn has a hash table
15
+ of prof_method_t, keyed on the method id. A hash table is used for quick
16
+ look up when doing a profile. However, it is exposed to Ruby as an array.
17
+
18
+ Each prof_method_t has two hash tables, parent and children, of prof_call_tree_t.
19
+ These objects keep track of a method's callers (who called the method) and its
20
+ callees (who the method called). These are keyed the method id, but once again,
21
+ are exposed to Ruby as arrays. Each prof_call_into_t maintains a pointer to the
22
+ caller or callee method, thereby making it easy to navigate through the call
23
+ hierarchy in ruby - which is very helpful for creating call graphs.
24
+ */
25
25
 
26
26
  #include "ruby_prof.h"
27
27
 
28
28
  #include "rp_allocation.h"
29
29
  #include "rp_measurement.h"
30
30
  #include "rp_method.h"
31
- #include "rp_call_info.h"
31
+ #include "rp_call_tree.h"
32
+ #include "rp_aggregate_call_tree.h"
33
+ #include "rp_call_trees.h"
32
34
  #include "rp_profile.h"
33
35
  #include "rp_stack.h"
34
36
  #include "rp_thread.h"
@@ -40,7 +42,9 @@ void Init_ruby_prof()
40
42
  mProf = rb_define_module("RubyProf");
41
43
 
42
44
  rp_init_allocation();
43
- rp_init_call_info();
45
+ rp_init_call_tree();
46
+ rp_init_aggregate_call_tree();
47
+ rp_init_call_trees();
44
48
  rp_init_measure();
45
49
  rp_init_method_info();
46
50
  rp_init_profile();
@@ -9,6 +9,15 @@
9
9
  #include <stdio.h>
10
10
  #include <stdbool.h>
11
11
 
12
+ #ifndef rb_st_lookup
13
+ #define rb_st_foreach st_foreach
14
+ #define rb_st_free_table st_free_table
15
+ #define rb_st_init_numtable st_init_numtable
16
+ #define rb_st_insert st_insert
17
+ #define rb_st_lookup st_lookup
18
+ #endif
19
+
20
+
12
21
  extern VALUE mProf;
13
22
 
14
23
  // This method is not exposed in Ruby header files - at least not as of Ruby 2.6.3 :(
@@ -64,7 +64,7 @@
64
64
  </PropertyGroup>
65
65
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
66
66
  <TargetExt>.so</TargetExt>
67
- <OutDir>..\</OutDir>
67
+ <OutDir>..\..\..\lib</OutDir>
68
68
  </PropertyGroup>
69
69
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
70
70
  <ClCompile>
@@ -102,30 +102,34 @@
102
102
  </ItemDefinitionGroup>
103
103
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
104
104
  <ClCompile>
105
- <AdditionalIncludeDirectories>C:\msys64\usr\local\ruby-2.6.5vc\include\ruby-2.6.0\x64-mswin64_140;C:\msys64\usr\local\ruby-2.6.5vc\include\ruby-2.6.0;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
105
+ <AdditionalIncludeDirectories>C:\msys64\usr\local\ruby-2.7.0vc\include\ruby-2.7.0\x64-mswin64_140;C:\msys64\usr\local\ruby-2.7.0vc\include\ruby-2.7.0;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
106
106
  <Optimization>Disabled</Optimization>
107
107
  <PreprocessorDefinitions>HAVE_RB_TRACEARG_CALLEE_ID;%(PreprocessorDefinitions)</PreprocessorDefinitions>
108
108
  </ClCompile>
109
109
  <Link>
110
- <AdditionalLibraryDirectories>C:\msys64\usr\local\ruby-2.6.5vc\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
111
- <AdditionalDependencies>x64-vcruntime140-ruby260.lib;%(AdditionalDependencies)</AdditionalDependencies>
110
+ <AdditionalLibraryDirectories>C:\msys64\usr\local\ruby-2.7.0vc\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
111
+ <AdditionalDependencies>x64-vcruntime140-ruby270.lib;%(AdditionalDependencies)</AdditionalDependencies>
112
112
  <ModuleDefinitionFile>ruby_prof.def</ModuleDefinitionFile>
113
+ <SubSystem>Console</SubSystem>
113
114
  </Link>
114
115
  </ItemDefinitionGroup>
115
116
  <ItemGroup>
117
+ <ClInclude Include="..\rp_aggregate_call_tree.h" />
116
118
  <ClInclude Include="..\rp_allocation.h" />
117
- <ClInclude Include="..\rp_call_info.h" />
119
+ <ClInclude Include="..\rp_call_tree.h" />
120
+ <ClInclude Include="..\rp_call_trees.h" />
118
121
  <ClInclude Include="..\rp_measurement.h" />
119
122
  <ClInclude Include="..\rp_method.h" />
120
123
  <ClInclude Include="..\rp_profile.h" />
121
124
  <ClInclude Include="..\rp_stack.h" />
122
125
  <ClInclude Include="..\rp_thread.h" />
123
126
  <ClInclude Include="..\ruby_prof.h" />
124
- <ClInclude Include="..\version.h" />
125
127
  </ItemGroup>
126
128
  <ItemGroup>
129
+ <ClCompile Include="..\rp_aggregate_call_tree.c" />
127
130
  <ClCompile Include="..\rp_allocation.c" />
128
- <ClCompile Include="..\rp_call_info.c" />
131
+ <ClCompile Include="..\rp_call_tree.c" />
132
+ <ClCompile Include="..\rp_call_trees.c" />
129
133
  <ClCompile Include="..\rp_measurement.c" />
130
134
  <ClCompile Include="..\rp_measure_allocations.c" />
131
135
  <ClCompile Include="..\rp_measure_memory.c" />
@@ -9,7 +9,7 @@ rescue LoadError
9
9
  end
10
10
 
11
11
  require 'ruby-prof/version'
12
- require 'ruby-prof/call_info'
12
+ require 'ruby-prof/call_tree'
13
13
  require 'ruby-prof/compatibility'
14
14
  require 'ruby-prof/measurement'
15
15
  require 'ruby-prof/method_info'
@@ -18,8 +18,7 @@ require 'ruby-prof/rack'
18
18
  require 'ruby-prof/thread'
19
19
 
20
20
  module RubyProf
21
- autoload :CallInfoVisitor, 'ruby-prof/call_info_visitor'
22
-
21
+ autoload :CallTreeVisitor, 'ruby-prof/call_tree_visitor'
23
22
  autoload :AbstractPrinter, 'ruby-prof/printers/abstract_printer'
24
23
  autoload :CallInfoPrinter, 'ruby-prof/printers/call_info_printer'
25
24
  autoload :CallStackPrinter, 'ruby-prof/printers/call_stack_printer'
@@ -697,13 +697,10 @@
697
697
  <div class="thread">
698
698
  <span>Thread: <%= thread.id %>, Fiber: <%= thread.fiber_id %> (<%= thread_info %>)</span>
699
699
  <ul name="thread">
700
- <% call_infos = thread.root_methods.map(&:callers).flatten %>
701
- <% call_infos.each do |call_info| %>
702
- <% visited = Set.new
703
- output = StringIO.new('')
704
- print_stack(output, visited, call_info, call_info.total_time) %>
705
- <%= output.string %>
706
- <% end %>
700
+ <% visited = Set.new
701
+ output = StringIO.new('')
702
+ print_stack(output, visited, thread.call_tree, thread.call_tree.total_time) %>
703
+ <%= output.string %>
707
704
  </ul>
708
705
  </div>
709
706
  <% end %>
@@ -217,8 +217,7 @@
217
217
  self_percentage = (method.self_time/total_time) * 100 %>
218
218
 
219
219
  <!-- Parents -->
220
- <% for caller in method.callers.sort
221
- next if method.root?
220
+ <% for caller in method.call_trees.callers.sort
222
221
  next if min_time && caller.total_time < min_time %>
223
222
  <tr>
224
223
  <td>&nbsp;</td>
@@ -228,12 +227,12 @@
228
227
  <td><%= sprintf("%.2f", caller.wait_time) %></td>
229
228
  <td><%= sprintf("%.2f", caller.children_time) %></td>
230
229
  <td><%= "#{caller.called}/#{method.called}" %></td>
231
- <td class="method_name"><%= create_link(thread, total_time, caller.parent) %></td>
230
+ <td class="method_name"><%= create_link(thread, total_time, caller.parent.target) %></td>
232
231
  <% if @result.track_allocations? %>
233
232
  <td>-</td>
234
233
  <% end %>
235
- <td><%= if caller.parent.source_file
236
- file_link(caller.parent.source_file, caller.line)
234
+ <td><%= if caller.parent.target.source_file
235
+ file_link(caller.parent.target.source_file, caller.line)
237
236
  end %></td>
238
237
  </tr>
239
238
  <% end %>
@@ -293,7 +292,7 @@
293
292
  <% end %>
294
293
 
295
294
  <!-- Children -->
296
- <% for callee in method.callees.sort_by(&:total_time).reverse
295
+ <% for callee in method.call_trees.callees.sort_by(&:total_time).reverse
297
296
  next if min_time && callee.total_time < min_time %>
298
297
  <tr>
299
298
  <td>&nbsp;</td>
@@ -1,11 +1,11 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module RubyProf
4
- # The CallInfo class is used to track the relationships between methods. It is a helper class used by
4
+ # The CallTree class is used to track the relationships between methods. It is a helper class used by
5
5
  # RubyProf::MethodInfo to keep track of which methods called a given method and which methods a given
6
- # method called. Each CallInfo has a parent and target method. You cannot create a CallInfo object directly,
6
+ # method called. Each CallTree has a parent and target method. You cannot create a CallTree object directly,
7
7
  # they are generated while running a profile.
8
- class CallInfo
8
+ class CallTree
9
9
  # The number of times the parent method called the target method
10
10
  def called
11
11
  self.measurement.called
@@ -31,7 +31,7 @@ module RubyProf
31
31
  self.total_time - self.self_time - self.wait_time
32
32
  end
33
33
 
34
- # Compares two CallInfo instances. The comparison is based on the CallInfo#parent, CallInfo#target,
34
+ # Compares two CallTree instances. The comparison is based on the CallTree#parent, CallTree#target,
35
35
  # and total time.
36
36
  def <=>(other)
37
37
  if self.target == other.target && self.parent == other.parent
@@ -47,11 +47,11 @@ module RubyProf
47
47
 
48
48
  # :nodoc:
49
49
  def to_s
50
- "#{parent ? parent.full_name : '<nil>'} - #{target.full_name}"
50
+ "<#{self.class.name} - #{self.target.full_name}>"
51
51
  end
52
52
 
53
53
  def inspect
54
- super + "(#{self.to_s})"
54
+ self.to_s
55
55
  end
56
56
  end
57
57
  end
@@ -0,0 +1,36 @@
1
+ module RubyProf
2
+ # The call info visitor class does a depth-first traversal across a
3
+ # list of call infos. At each call_tree node, the visitor executes
4
+ # the block provided in the #visit method. The block is passed two
5
+ # parameters, the event and the call_tree instance. Event will be
6
+ # either :enter or :exit.
7
+ #
8
+ # visitor = RubyProf::CallTreeVisitor.new(result.threads.first.call_tree)
9
+ #
10
+ # method_names = Array.new
11
+ #
12
+ # visitor.visit do |call_tree, event|
13
+ # method_names << call_tree.target.full_name if event == :enter
14
+ # end
15
+ #
16
+ # puts method_names
17
+ class CallTreeVisitor
18
+ def initialize(call_tree)
19
+ @call_tree = call_tree
20
+ end
21
+
22
+ def visit(&block)
23
+ visit_call_tree(@call_tree, &block)
24
+ end
25
+
26
+ private
27
+
28
+ def visit_call_tree(call_tree, &block)
29
+ yield call_tree, :enter
30
+ call_tree.children.each do |child|
31
+ visit_call_tree(child, &block)
32
+ end
33
+ yield call_tree, :exit
34
+ end
35
+ end
36
+ end
@@ -1,8 +1,11 @@
1
1
  module RubyProf
2
2
  # The Measurement class is a helper class used by RubyProf::MethodInfo to store information about the method.
3
- # You cannot create a CallInfo object directly, they are generated while running a profile.
3
+ # You cannot create a CallTree object directly, they are generated while running a profile.
4
4
  class Measurement
5
- # :nodoc:
5
+ def children_time
6
+ self.total_time - self.self_time - self.wait_time
7
+ end
8
+
6
9
  def to_s
7
10
  "c: #{called}, tt: #{total_time}, st: #{self_time}"
8
11
  end
@@ -52,14 +52,9 @@ module RubyProf
52
52
  self.total_time - self.self_time - self.wait_time
53
53
  end
54
54
 
55
- # The min call depth of this method
56
- def min_depth
57
- @min_depth ||= callers.map(&:depth).min
58
- end
59
-
60
55
  # :enddoc:
61
56
  def <=>(other)
62
- if other == nil
57
+ if other.nil?
63
58
  -1
64
59
  elsif self.full_name == other.full_name
65
60
  0
@@ -67,9 +62,9 @@ module RubyProf
67
62
  -1
68
63
  elsif self.total_time > other.total_time
69
64
  1
70
- elsif self.min_depth < other.min_depth
65
+ elsif self.call_trees.min_depth < other.call_trees.min_depth
71
66
  1
72
- elsif self.min_depth > other.min_depth
67
+ elsif self.call_trees.min_depth > other.call_trees.min_depth
73
68
  -1
74
69
  else
75
70
  self.full_name <=> other.full_name
@@ -79,12 +74,5 @@ module RubyProf
79
74
  def to_s
80
75
  "#{self.full_name} (c: #{self.called}, tt: #{self.total_time}, st: #{self.self_time}, wt: #{wait_time}, ct: #{self.children_time})"
81
76
  end
82
-
83
- # Remove method from the call graph. should not be called directly.
84
- def eliminate!
85
- # $stderr.puts "eliminating #{self}"
86
- callers.each{ |call_info| call_info.eliminate! }
87
- callers.clear
88
- end
89
77
  end
90
78
  end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module RubyProf
4
- # Prints out the call graph based on CallInfo instances. This
4
+ # Prints out the call graph based on CallTree instances. This
5
5
  # is mainly for debugging purposes as it provides access into
6
6
  # into RubyProf's internals.
7
7
  #
@@ -19,6 +19,7 @@ module RubyProf
19
19
  private
20
20
 
21
21
  def print_header(thread)
22
+ @output << "----------------------------------------------------\n"
22
23
  @output << "Thread ID: #{thread.id}\n"
23
24
  @output << "Fiber ID: #{thread.fiber_id}\n"
24
25
  @output << "Total Time: #{thread.total_time}\n"
@@ -27,18 +28,18 @@ module RubyProf
27
28
  end
28
29
 
29
30
  def print_methods(thread)
30
- visitor = CallInfoVisitor.new(thread.root_methods)
31
+ visitor = CallTreeVisitor.new(thread.call_tree)
31
32
 
32
- visitor.visit do |call_info, event|
33
+ visitor.visit do |call_tree, event|
33
34
  if event == :enter
34
- @output << " " * call_info.depth
35
- @output << call_info.target.full_name
35
+ @output << " " * call_tree.depth
36
+ @output << call_tree.target.full_name
36
37
  @output << " ("
37
- @output << "tt:#{sprintf("%#{TIME_WIDTH}.2f", call_info.total_time)}, "
38
- @output << "st:#{sprintf("%#{TIME_WIDTH}.2f", call_info.self_time)}, "
39
- @output << "wt:#{sprintf("%#{TIME_WIDTH}.2f", call_info.wait_time)}, "
40
- @output << "ct:#{sprintf("%#{TIME_WIDTH}.2f", call_info.children_time)}, "
41
- @output << "call:#{call_info.called}, "
38
+ @output << "tt:#{sprintf("%#{TIME_WIDTH}.2f", call_tree.total_time)}, "
39
+ @output << "st:#{sprintf("%#{TIME_WIDTH}.2f", call_tree.self_time)}, "
40
+ @output << "wt:#{sprintf("%#{TIME_WIDTH}.2f", call_tree.wait_time)}, "
41
+ @output << "ct:#{sprintf("%#{TIME_WIDTH}.2f", call_tree.children_time)}, "
42
+ @output << "call:#{call_tree.called}, "
42
43
  @output << ")"
43
44
  @output << "\n"
44
45
  end
@@ -46,6 +47,7 @@ module RubyProf
46
47
  end
47
48
 
48
49
  def print_footer(thread)
50
+ @output << "\n" << "\n"
49
51
  end
50
52
  end
51
53
  end
@@ -46,7 +46,6 @@ module RubyProf
46
46
  def print(output = STDOUT, options = {})
47
47
  setup_options(options)
48
48
  output << @erb.result(binding)
49
- a = 1
50
49
  end
51
50
 
52
51
  # :enddoc:
@@ -55,50 +54,49 @@ module RubyProf
55
54
  @erb = ERB.new(self.template)
56
55
  end
57
56
 
58
- def print_stack(output, visited, call_info, parent_time)
59
- total_time = call_info.total_time
57
+ def print_stack(output, visited, call_tree, parent_time)
58
+ total_time = call_tree.total_time
60
59
  percent_parent = (total_time/parent_time)*100
61
60
  percent_total = (total_time/@overall_time)*100
62
61
  return unless percent_total > min_percent
63
62
  color = self.color(percent_total)
64
- kids = call_info.target.callees
65
63
  visible = percent_total >= threshold
66
64
  expanded = percent_total >= expansion
67
65
  display = visible ? "block" : "none"
68
66
 
69
67
  output << "<li class=\"color#{color}\" style=\"display:#{display}\">" << "\n"
70
68
 
71
- if visited.include?(call_info)
69
+ if visited.include?(call_tree)
72
70
  output << "<a href=\"#\" class=\"toggle empty\" ></a>" << "\n"
73
- output << "<span>%s %s</span>" % [link(call_info.target, true), graph_link(call_info)] << "\n"
71
+ output << "<span>%s %s</span>" % [link(call_tree.target, true), graph_link(call_tree)] << "\n"
74
72
  else
75
- visited << call_info
73
+ visited << call_tree
76
74
 
77
- if kids.empty?
75
+ if call_tree.children.empty?
78
76
  output << "<a href=\"#\" class=\"toggle empty\" ></a>" << "\n"
79
77
  else
80
- visible_children = kids.any?{|ci| (ci.total_time/@overall_time)*100 >= threshold}
78
+ visible_children = call_tree.children.any?{|ci| (ci.total_time/@overall_time)*100 >= threshold}
81
79
  image = visible_children ? (expanded ? "minus" : "plus") : "empty"
82
80
  output << "<a href=\"#\" class=\"toggle #{image}\" ></a>" << "\n"
83
81
  end
84
82
  output << "<span>%4.2f%% (%4.2f%%) %s %s</span>" % [percent_total, percent_parent,
85
- link(call_info.target, false), graph_link(call_info)] << "\n"
83
+ link(call_tree.target, false), graph_link(call_tree)] << "\n"
86
84
 
87
- unless kids.empty?
85
+ unless call_tree.children.empty?
88
86
  output << (expanded ? '<ul>' : '<ul style="display:none">') << "\n"
89
- kids.sort_by{|c| -c.total_time}.each do |child_call_info|
90
- print_stack(output, visited, child_call_info, total_time)
87
+ call_tree.children.sort_by{|c| -c.total_time}.each do |child_call_tree|
88
+ print_stack(output, visited, child_call_tree, total_time)
91
89
  end
92
90
  output << '</ul>' << "\n"
93
91
  end
94
92
 
95
- visited.delete(call_info)
93
+ visited.delete(call_tree)
96
94
  end
97
95
  output << '</li>' << "\n"
98
96
  end
99
97
 
100
- def name(call_info)
101
- method = call_info.target
98
+ def name(call_tree)
99
+ method = call_tree.target
102
100
  method.full_name
103
101
  end
104
102
 
@@ -112,19 +110,18 @@ module RubyProf
112
110
  end
113
111
  end
114
112
 
115
- def graph_link(call_info)
116
- total_calls = call_info.target.called
117
- href = "#{method_href(call_info.target)}"
113
+ def graph_link(call_tree)
114
+ total_calls = call_tree.target.called
118
115
  totals = total_calls.to_s
119
- "[#{call_info.called} calls, #{totals} total]"
116
+ "[#{call_tree.called} calls, #{totals} total]"
120
117
  end
121
118
 
122
119
  def method_href(method)
123
120
  h(method.full_name.gsub(/[><#\.\?=:]/,"_"))
124
121
  end
125
122
 
126
- def total_time(call_infos)
127
- sum(call_infos.map{|ci| ci.total_time})
123
+ def total_time(call_trees)
124
+ sum(call_trees.map{|ci| ci.total_time})
128
125
  end
129
126
 
130
127
  def sum(a)