ruby-prof 0.8.1-x86-mingw32 → 0.11.0.rc1-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. data/CHANGES +89 -13
  2. data/LICENSE +4 -3
  3. data/{README → README.rdoc} +155 -162
  4. data/Rakefile +50 -123
  5. data/bin/ruby-prof +86 -47
  6. data/examples/empty.png +0 -0
  7. data/examples/graph.dot +106 -0
  8. data/examples/graph.png +0 -0
  9. data/examples/minus.png +0 -0
  10. data/examples/multi.flat.txt +23 -0
  11. data/examples/multi.graph.html +906 -0
  12. data/examples/multi.grind.dat +194 -0
  13. data/examples/multi.stack.html +573 -0
  14. data/examples/plus.png +0 -0
  15. data/examples/stack.html +573 -0
  16. data/ext/ruby_prof/extconf.rb +53 -0
  17. data/ext/ruby_prof/rp_call_info.c +369 -0
  18. data/ext/ruby_prof/rp_call_info.h +46 -0
  19. data/ext/ruby_prof/rp_measure.c +48 -0
  20. data/ext/ruby_prof/rp_measure.h +45 -0
  21. data/ext/ruby_prof/rp_measure_allocations.c +86 -0
  22. data/ext/ruby_prof/rp_measure_cpu_time.c +112 -0
  23. data/ext/ruby_prof/rp_measure_gc_runs.c +87 -0
  24. data/ext/ruby_prof/rp_measure_gc_time.c +73 -0
  25. data/ext/ruby_prof/rp_measure_memory.c +81 -0
  26. data/ext/ruby_prof/rp_measure_process_time.c +71 -0
  27. data/ext/ruby_prof/rp_measure_wall_time.c +42 -0
  28. data/ext/ruby_prof/rp_method.c +363 -0
  29. data/ext/ruby_prof/rp_method.h +55 -0
  30. data/ext/ruby_prof/rp_stack.c +61 -0
  31. data/ext/ruby_prof/rp_stack.h +40 -0
  32. data/ext/ruby_prof/rp_thread.c +113 -0
  33. data/ext/ruby_prof/rp_thread.h +20 -0
  34. data/ext/ruby_prof/ruby_prof.c +332 -1377
  35. data/ext/ruby_prof/ruby_prof.h +54 -188
  36. data/ext/ruby_prof/version.h +6 -3
  37. data/lib/1.8/ruby_prof.so +0 -0
  38. data/lib/1.9/ruby_prof.exp +0 -0
  39. data/lib/1.9/ruby_prof.ilk +0 -0
  40. data/lib/1.9/ruby_prof.lib +0 -0
  41. data/lib/1.9/ruby_prof.pdb +0 -0
  42. data/lib/1.9/ruby_prof.so +0 -0
  43. data/lib/ruby-prof.rb +32 -18
  44. data/lib/ruby-prof/abstract_printer.rb +15 -5
  45. data/lib/ruby-prof/aggregate_call_info.rb +11 -3
  46. data/lib/ruby-prof/call_info.rb +68 -1
  47. data/lib/ruby-prof/call_stack_printer.rb +775 -0
  48. data/lib/ruby-prof/call_tree_printer.rb +17 -9
  49. data/lib/ruby-prof/compatibility.rb +134 -0
  50. data/lib/ruby-prof/dot_printer.rb +152 -0
  51. data/lib/ruby-prof/empty.png +0 -0
  52. data/lib/ruby-prof/flat_printer.rb +23 -24
  53. data/lib/ruby-prof/flat_printer_with_line_numbers.rb +17 -21
  54. data/lib/ruby-prof/graph_html_printer.rb +69 -39
  55. data/lib/ruby-prof/graph_printer.rb +35 -35
  56. data/lib/ruby-prof/method_info.rb +26 -4
  57. data/lib/ruby-prof/minus.png +0 -0
  58. data/lib/ruby-prof/multi_printer.rb +56 -0
  59. data/lib/ruby-prof/plus.png +0 -0
  60. data/lib/ruby-prof/profile.rb +72 -0
  61. data/lib/ruby-prof/rack.rb +31 -0
  62. data/lib/ruby-prof/symbol_to_proc.rb +3 -1
  63. data/lib/ruby-prof/task.rb +20 -19
  64. data/lib/ruby-prof/test.rb +5 -3
  65. data/lib/ruby_prof.exp +0 -0
  66. data/lib/ruby_prof.ilk +0 -0
  67. data/lib/ruby_prof.lib +0 -0
  68. data/lib/ruby_prof.pdb +0 -0
  69. data/lib/ruby_prof.so +0 -0
  70. data/lib/unprof.rb +2 -0
  71. data/test/aggregate_test.rb +29 -14
  72. data/test/basic_test.rb +3 -251
  73. data/test/bug_test.rb +6 -0
  74. data/test/duplicate_names_test.rb +4 -4
  75. data/test/dynamic_method_test.rb +61 -0
  76. data/test/enumerable_test.rb +4 -4
  77. data/test/exceptions_test.rb +6 -5
  78. data/test/exclude_threads_test.rb +47 -47
  79. data/test/exec_test.rb +5 -5
  80. data/test/line_number_test.rb +16 -16
  81. data/test/measure_allocations_test.rb +25 -0
  82. data/test/measure_cpu_time_test.rb +212 -0
  83. data/test/measure_gc_runs_test.rb +29 -0
  84. data/test/measure_gc_time_test.rb +29 -0
  85. data/test/measure_memory_test.rb +36 -0
  86. data/test/measure_process_time_test.rb +205 -0
  87. data/test/measure_wall_time_test.rb +209 -0
  88. data/test/method_elimination_test.rb +74 -0
  89. data/test/module_test.rb +12 -21
  90. data/test/multi_printer_test.rb +81 -0
  91. data/test/no_method_class_test.rb +5 -3
  92. data/test/prime.rb +7 -10
  93. data/test/prime_test.rb +3 -3
  94. data/test/printers_test.rb +180 -54
  95. data/test/recursive_test.rb +34 -72
  96. data/test/singleton_test.rb +5 -4
  97. data/test/stack_printer_test.rb +73 -0
  98. data/test/stack_test.rb +7 -7
  99. data/test/start_stop_test.rb +23 -6
  100. data/test/test_helper.rb +81 -0
  101. data/test/test_suite.rb +35 -21
  102. data/test/thread_test.rb +40 -39
  103. data/test/unique_call_path_test.rb +6 -6
  104. metadata +106 -51
  105. data/ext/ruby_prof/measure_allocations.h +0 -58
  106. data/ext/ruby_prof/measure_cpu_time.h +0 -152
  107. data/ext/ruby_prof/measure_gc_runs.h +0 -76
  108. data/ext/ruby_prof/measure_gc_time.h +0 -57
  109. data/ext/ruby_prof/measure_memory.h +0 -101
  110. data/ext/ruby_prof/measure_process_time.h +0 -52
  111. data/ext/ruby_prof/measure_wall_time.h +0 -53
  112. data/ext/ruby_prof/mingw/Rakefile +0 -23
  113. data/ext/ruby_prof/mingw/build.rake +0 -38
  114. data/rails/environment/profile.rb +0 -24
  115. data/rails/example/example_test.rb +0 -9
  116. data/rails/profile_test_helper.rb +0 -21
  117. data/test/current_failures_windows +0 -8
  118. data/test/measurement_test.rb +0 -121
  119. data/test/ruby-prof-bin +0 -20
@@ -1,14 +1,26 @@
1
- require 'ruby-prof/abstract_printer'
1
+ # encoding: utf-8
2
2
 
3
3
  module RubyProf
4
4
  # Generate profiling information in calltree format
5
5
  # for use by kcachegrind and similar tools.
6
6
 
7
7
  class CallTreePrinter < AbstractPrinter
8
+ # Specify print options.
9
+ #
10
+ # options - Hash table
11
+ # :min_percent - Number 0 to 100 that specifes the minimum
12
+ # %self (the methods self time divided by the
13
+ # overall total time) that a method must take
14
+ # for it to be printed out in the report.
15
+ # Default value is 0.
16
+ #
17
+ # :print_file - True or false. Specifies if a method's source
18
+ # file should be printed. Default value if false.
19
+ #
8
20
  def print(output = STDOUT, options = {})
9
21
  @output = output
10
22
  setup_options(options)
11
-
23
+
12
24
  # add a header - this information is somewhat arbitrary
13
25
  @output << "events: "
14
26
  case RubyProf.measure_mode
@@ -55,15 +67,11 @@ module RubyProf
55
67
  File.expand_path(method.source_file)
56
68
  end
57
69
 
58
- def name(method)
59
- "#{method.klass_name}::#{method.method_name}"
60
- end
61
-
62
70
  def print_methods(thread_id, methods)
63
- methods.reverse_each do |method|
71
+ methods.reverse_each do |method|
64
72
  # Print out the file and method name
65
73
  @output << "fl=#{file(method)}\n"
66
- @output << "fn=#{name(method)}\n"
74
+ @output << "fn=#{method_name(method)}\n"
67
75
 
68
76
  # Now print out the function line number and its self time
69
77
  @output << "#{method.line} #{convert(method.self_time)}\n"
@@ -71,7 +79,7 @@ module RubyProf
71
79
  # Now print out all the children methods
72
80
  method.children.each do |callee|
73
81
  @output << "cfl=#{file(callee.target)}\n"
74
- @output << "cfn=#{name(callee.target)}\n"
82
+ @output << "cfn=#{method_name(callee.target)}\n"
75
83
  @output << "calls=#{callee.called} #{callee.line}\n"
76
84
 
77
85
  # Print out total times here!
@@ -0,0 +1,134 @@
1
+ # encoding: utf-8
2
+
3
+ # These methods are here for backwards compatability with previous RubyProf releases
4
+ module RubyProf
5
+ # Measurements
6
+ def self.cpu_frequency
7
+ Measure::CpuTime.frequency
8
+ end
9
+
10
+ def self.cpu_frequency=(value)
11
+ Measure::CpuTime.frequency = value
12
+ end
13
+
14
+ def self.measure_allocations
15
+ Measure::Allocations.measure
16
+ end
17
+
18
+ def self.measure_cpu_time
19
+ Measure::CpuTime.measure
20
+ end
21
+
22
+ def self.measure_gc_runs
23
+ Measure::GcRuns.measure
24
+ end
25
+
26
+ def self.measure_gc_time
27
+ Measure::GcTime.measure
28
+ end
29
+
30
+ def self.measure_memory
31
+ Measure::Memory.measure
32
+ end
33
+
34
+ def self.measure_process_time
35
+ Measure::ProcessTime.measure
36
+ end
37
+
38
+ def self.measure_wall_time
39
+ Measure::WallTime.measure
40
+ end
41
+
42
+ # call-seq:
43
+ # measure_mode -> measure_mode
44
+ #
45
+ # Returns what ruby-prof is measuring. Valid values include:
46
+ #
47
+ # *RubyProf::PROCESS_TIME - Measure process time. This is default. It is implemented using the clock functions in the C Runtime library.
48
+ # *RubyProf::WALL_TIME - Measure wall time using gettimeofday on Linx and GetLocalTime on Windows
49
+ # *RubyProf::CPU_TIME - Measure time using the CPU clock counter. This mode is only supported on Pentium or PowerPC platforms.
50
+ # *RubyProf::ALLOCATIONS - Measure object allocations. This requires a patched Ruby interpreter.
51
+ # *RubyProf::MEMORY - Measure memory size. This requires a patched Ruby interpreter.
52
+ # *RubyProf::GC_RUNS - Measure number of garbage collections. This requires a patched Ruby interpreter.
53
+ # *RubyProf::GC_TIME - Measure time spent doing garbage collection. This requires a patched Ruby interpreter.*/
54
+
55
+ def self.measure_mode
56
+ @measure_mode ||= RubyProf::WALL_TIME
57
+ end
58
+
59
+ # call-seq:
60
+ # measure_mode=value -> void
61
+ #
62
+ # Specifies what ruby-prof should measure. Valid values include:
63
+ #
64
+ # *RubyProf::PROCESS_TIME - Measure process time. This is default. It is implemented using the clock functions in the C Runtime library.
65
+ # *RubyProf::WALL_TIME - Measure wall time using gettimeofday on Linx and GetLocalTime on Windows
66
+ # *RubyProf::CPU_TIME - Measure time using the CPU clock counter. This mode is only supported on Pentium or PowerPC platforms.
67
+ # *RubyProf::ALLOCATIONS - Measure object allocations. This requires a patched Ruby interpreter.
68
+ # *RubyProf::MEMORY - Measure memory size. This requires a patched Ruby interpreter.
69
+ # *RubyProf::GC_RUNS - Measure number of garbage collections. This requires a patched Ruby interpreter.
70
+ # *RubyProf::GC_TIME - Measure time spent doing garbage collection. This requires a patched Ruby interpreter.*/
71
+ def self.measure_mode=(value)
72
+ @measure_mode = value
73
+ end
74
+
75
+ # call-seq:
76
+ # exclude_threads= -> void
77
+ #
78
+ # Specifies what threads ruby-prof should exclude from profiling
79
+
80
+ def self.exclude_threads
81
+ @exclude_threads ||= Array.new
82
+ end
83
+
84
+ def self.exclude_threads=(value)
85
+ @exclude_threads = value
86
+ end
87
+
88
+ # Profiling
89
+ def self.start
90
+ if running?
91
+ raise(RuntimeError, "RubyProf is already running");
92
+ end
93
+ @profile = Profile.new(self.measure_mode, self.exclude_threads)
94
+ @profile.start
95
+ end
96
+
97
+ def self.pause
98
+ unless running?
99
+ raise(RuntimeError, "RubyProf.start was not yet called");
100
+ end
101
+ @profile.pause
102
+ end
103
+
104
+ def self.running?
105
+ if defined?(@profile) and @profile
106
+ @profile.running?
107
+ else
108
+ false
109
+ end
110
+ end
111
+
112
+ def self.resume
113
+ unless running?
114
+ raise(RuntimeError, "RubyProf.start was not yet called");
115
+ end
116
+ @profile.resume
117
+ end
118
+
119
+ def self.stop
120
+ unless running?
121
+ raise(RuntimeError, "RubyProf.start was not yet called");
122
+ end
123
+ result = @profile.stop
124
+ @profile = nil
125
+ result
126
+ end
127
+
128
+ def self.profile(&block)
129
+ if running?
130
+ raise(RuntimeError, "RubyProf is already running");
131
+ end
132
+ Profile.profile(self.measure_mode, self.exclude_threads, &block)
133
+ end
134
+ end
@@ -0,0 +1,152 @@
1
+ # encoding: utf-8
2
+
3
+ require 'set'
4
+
5
+ module RubyProf
6
+ # Generates a graphviz graph in dot format.
7
+ # To use the dot printer:
8
+ #
9
+ # result = RubyProf.profile do
10
+ # [code to profile]
11
+ # end
12
+ #
13
+ # printer = RubyProf::DotPrinter.new(result)
14
+ # printer.print(STDOUT)
15
+ #
16
+ # You can use either dot viewer such as GraphViz, or the dot command line tool
17
+ # to reformat the output into a wide variety of outputs:
18
+ #
19
+ # dot -Tpng graph.dot > graph.png
20
+ #
21
+ class DotPrinter < RubyProf::AbstractPrinter
22
+ CLASS_COLOR = '"#666666"'
23
+ EDGE_COLOR = '"#666666"'
24
+
25
+ # Creates the DotPrinter using a RubyProf::Result.
26
+ def initialize(result)
27
+ super(result)
28
+ @seen_methods = Set.new
29
+ end
30
+
31
+ # Print a graph report to the provided output.
32
+ #
33
+ # output - Any IO object, including STDOUT or a file. The default value is
34
+ # STDOUT.
35
+ #
36
+ # options - Hash of print options. See #setup_options
37
+ # for more information.
38
+ #
39
+ # When profiling results that cover a large number of method calls it
40
+ # helps to use the :min_percent option, for example:
41
+ #
42
+ # DotPrinter.new(result).print(STDOUT, :min_percent=>5)
43
+ #
44
+ def print(output = STDOUT, options = {})
45
+ @output = output
46
+ setup_options(options)
47
+
48
+ total_time = thread_times.values.inject{|a,b| a+b}
49
+
50
+ puts 'digraph "Profile" {'
51
+ puts "label=\"#{mode_name} >=#{min_percent}%\\nTotal: #{total_time}\";"
52
+ puts "labelloc=t;"
53
+ puts "labeljust=l;"
54
+ print_threads
55
+ puts '}'
56
+ end
57
+
58
+ private
59
+
60
+ # Something of a hack, figure out which constant went with the
61
+ # RubyProf.measure_mode so that we can display it. Otherwise it's easy to
62
+ # forget what measurement was made.
63
+ def mode_name
64
+ RubyProf.constants.find{|c| RubyProf.const_get(c) == RubyProf.measure_mode}
65
+ end
66
+
67
+ # Computes the total time per thread:
68
+ def thread_times
69
+ @thread_times ||= begin
70
+ times = {}
71
+ @result.threads.each do |thread_id, methods|
72
+ toplevel = methods.sort.last
73
+
74
+ total_time = toplevel.total_time
75
+ # This looks like a hack for very small times... from GraphPrinter
76
+ total_time = 0.01 if total_time == 0
77
+ times[thread_id] = total_time
78
+ end
79
+
80
+ times
81
+ end
82
+ end
83
+
84
+ def print_threads
85
+ # sort assumes that spawned threads have higher object_ids
86
+ @result.threads.sort.each do |thread_id, methods|
87
+ puts "subgraph \"Thread #{thread_id}\" {"
88
+
89
+ print_methods(thread_id, methods)
90
+ puts "}"
91
+
92
+ print_classes(thread_id, methods)
93
+ end
94
+ end
95
+
96
+ # Determines an ID to use to represent the subject in the Dot file.
97
+ def dot_id(subject)
98
+ subject.object_id
99
+ end
100
+
101
+ def print_methods(thread_id, methods)
102
+ total_time = thread_times[thread_id]
103
+ methods.sort_by(&sort_method).reverse_each do |method|
104
+ total_percentage = (method.total_time/total_time) * 100
105
+
106
+ next if total_percentage < min_percent
107
+ name = method_name(method).split("#").last
108
+ puts "#{dot_id(method)} [label=\"#{name}\\n(#{total_percentage.round}%)\"];"
109
+ @seen_methods << method
110
+ print_edges(total_time, method)
111
+ end
112
+ end
113
+
114
+ def print_classes(thread_id, methods)
115
+ grouped = {}
116
+ methods.each{|m| grouped[m.klass_name] ||= []; grouped[m.klass_name] << m}
117
+ grouped.each do |cls, methods2|
118
+ # Filter down to just seen methods
119
+ big_methods, small_methods = methods2.partition{|m| @seen_methods.include? m}
120
+
121
+ if !big_methods.empty?
122
+ puts "subgraph cluster_#{cls.object_id} {"
123
+ puts "label = \"#{cls}\";"
124
+ puts "fontcolor = #{CLASS_COLOR};"
125
+ puts "fontsize = 16;"
126
+ puts "color = #{CLASS_COLOR};"
127
+ big_methods.each do |m|
128
+ puts "#{m.object_id};"
129
+ end
130
+ puts "}"
131
+ end
132
+ end
133
+ end
134
+
135
+ def print_edges(total_time, method)
136
+ method.aggregate_children.sort_by(&:total_time).reverse.each do |child|
137
+
138
+ target_percentage = (child.target.total_time / total_time) * 100.0
139
+ next if target_percentage < min_percent
140
+
141
+ # Get children method
142
+ puts "#{dot_id(method)} -> #{dot_id(child.target)} [label=\"#{child.called}/#{child.target.called}\" fontsize=10 fontcolor=#{EDGE_COLOR}];"
143
+ end
144
+ end
145
+
146
+ # Silly little helper for printing to the @output
147
+ def puts(str)
148
+ @output.puts(str)
149
+ end
150
+
151
+ end
152
+ end
Binary file
@@ -1,7 +1,7 @@
1
- require 'ruby-prof/abstract_printer'
1
+ # encoding: utf-8
2
2
 
3
3
  module RubyProf
4
- # Generates flat[link:files/examples/flat_txt.html] profile reports as text.
4
+ # Generates flat[link:files/examples/flat_txt.html] profile reports as text.
5
5
  # To use the flat printer:
6
6
  #
7
7
  # result = RubyProf.profile do
@@ -9,32 +9,35 @@ module RubyProf
9
9
  # end
10
10
  #
11
11
  # printer = RubyProf::FlatPrinter.new(result)
12
- # printer.print(STDOUT, 0)
12
+ # printer.print(STDOUT, {})
13
13
  #
14
14
  class FlatPrinter < AbstractPrinter
15
15
  # Print a flat profile report to the provided output.
16
- #
17
- # output - Any IO oject, including STDOUT or a file.
16
+ #
17
+ # output - Any IO object, including STDOUT or a file.
18
18
  # The default value is STDOUT.
19
- #
20
- # options - Hash of print options. See #setup_options
21
- # for more information.
19
+ #
20
+ # options - Hash of print options. See #setup_options
21
+ # for more information.
22
22
  #
23
23
  def print(output = STDOUT, options = {})
24
24
  @output = output
25
+ # Now sort methods by largest self time by default,
26
+ # not total time like in other printouts
27
+ options[:sort_method] ||= :self_time
25
28
  setup_options(options)
26
29
  print_threads
27
- end
28
-
29
- private
30
-
30
+ end
31
+
32
+ private
33
+
31
34
  def print_threads
32
35
  @result.threads.each do |thread_id, methods|
33
36
  print_methods(thread_id, methods)
34
37
  @output << "\n" * 2
35
38
  end
36
39
  end
37
-
40
+
38
41
  def print_methods(thread_id, methods)
39
42
  # Get total time
40
43
  toplevel = methods.max
@@ -42,27 +45,23 @@ module RubyProf
42
45
  if total_time == 0
43
46
  total_time = 0.01
44
47
  end
45
-
46
- # Now sort methods by largest self time,
47
- # not total time like in other printouts
48
- methods = methods.sort do |m1, m2|
49
- m1.self_time <=> m2.self_time
50
- end.reverse
51
-
48
+
49
+ methods = methods.sort_by(&sort_method).reverse
50
+
52
51
  @output << "Thread ID: %d\n" % thread_id
53
52
  @output << "Total: %0.6f\n" % total_time
54
53
  @output << "\n"
55
54
  @output << " %self total self wait child calls name\n"
56
55
 
57
- sum = 0
56
+ sum = 0
58
57
  methods.each do |method|
59
58
  self_percent = (method.self_time / total_time) * 100
60
59
  next if self_percent < min_percent
61
-
60
+
62
61
  sum += method.self_time
63
62
  #self_time_called = method.called > 0 ? method.self_time/method.called : 0
64
63
  #total_time_called = method.called > 0? method.total_time/method.called : 0
65
-
64
+
66
65
  @output << "%6.2f %8.2f %8.2f %8.2f %8.2f %8d %s\n" % [
67
66
  method.self_time / total_time * 100, # %self
68
67
  method.total_time, # total
@@ -75,4 +74,4 @@ module RubyProf
75
74
  end
76
75
  end
77
76
  end
78
- end
77
+ end
@@ -1,7 +1,7 @@
1
- require 'ruby-prof/abstract_printer'
2
- require 'pathname'
1
+ # encoding: utf-8
2
+
3
3
  module RubyProf
4
- # Generates flat[link:files/examples/flat_txt.html] profile reports as text.
4
+ # Generates flat[link:files/examples/flat_txt.html] profile reports as text.
5
5
  # To use the flat printer with line numbers:
6
6
  #
7
7
  # result = RubyProf.profile do
@@ -9,7 +9,7 @@ module RubyProf
9
9
  # end
10
10
  #
11
11
  # printer = RubyProf::FlatPrinterWithLineNumbers.new(result)
12
- # printer.print(STDOUT, 0)
12
+ # printer.print(STDOUT, {})
13
13
  #
14
14
  class FlatPrinterWithLineNumbers < FlatPrinter
15
15
 
@@ -20,26 +20,22 @@ module RubyProf
20
20
  if total_time == 0
21
21
  total_time = 0.01
22
22
  end
23
-
24
- # Now sort methods by largest self time,
25
- # not total time like in other printouts
26
- methods = methods.sort do |m1, m2|
27
- m1.self_time <=> m2.self_time
28
- end.reverse
29
-
23
+
24
+ methods = methods.sort_by(&sort_method).reverse
25
+
30
26
  @output << "Thread ID: %d\n" % thread_id
31
27
  @output << "Total: %0.6f\n" % total_time
32
28
  @output << "\n"
33
29
  @output << " %self total self wait child calls name\n"
34
- sum = 0
30
+ sum = 0
35
31
  methods.each do |method|
36
32
  self_percent = (method.self_time / total_time) * 100
37
33
  next if self_percent < min_percent
38
-
34
+
39
35
  sum += method.self_time
40
36
  #self_time_called = method.called > 0 ? method.self_time/method.called : 0
41
37
  #total_time_called = method.called > 0? method.total_time/method.called : 0
42
-
38
+
43
39
  @output << "%6.2f %8.2f %8.2f %8.2f %8.2f %8d %s " % [
44
40
  method.self_time / total_time * 100, # %self
45
41
  method.total_time, # total
@@ -47,26 +43,26 @@ module RubyProf
47
43
  method.wait_time, # wait
48
44
  method.children_time, # children
49
45
  method.called, # calls
50
- method_name(method), # name
46
+ method_name(method), # name
51
47
  ]
52
48
  if method.source_file != 'ruby_runtime'
53
49
  @output << " %s:%s" % [File.expand_path(method.source_file), method.line]
54
50
  end
55
51
  @output << "\n\tcalled from: "
56
-
52
+
57
53
  # make sure they're unique
58
- method.call_infos.map{|ci|
54
+ method.call_infos.map{|ci|
59
55
  if ci.parent && ci.parent.target.source_file != 'ruby_runtime'
60
56
  [method_name(ci.parent.target), File.expand_path(ci.parent.target.source_file), ci.parent.target.line]
61
57
  else
62
58
  nil
63
- end
59
+ end
64
60
  }.compact.uniq.each{|args|
65
- @output << " %s (%s:%s) " % args
61
+ @output << " %s (%s:%s) " % args
66
62
  }
67
- @output << "\n\n"
63
+ @output << "\n\n"
68
64
  end
69
65
  end
70
66
  end
71
- end
67
+ end
72
68