ruby-prof 1.4.3 → 1.6.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +59 -9
  3. data/{README.rdoc → README.md} +2 -2
  4. data/Rakefile +4 -4
  5. data/bin/ruby-prof +100 -87
  6. data/ext/ruby_prof/rp_allocation.c +140 -85
  7. data/ext/ruby_prof/rp_allocation.h +8 -6
  8. data/ext/ruby_prof/rp_call_tree.c +502 -369
  9. data/ext/ruby_prof/rp_call_tree.h +47 -43
  10. data/ext/ruby_prof/rp_call_trees.c +16 -8
  11. data/ext/ruby_prof/rp_measure_allocations.c +10 -13
  12. data/ext/ruby_prof/rp_measure_memory.c +8 -4
  13. data/ext/ruby_prof/rp_measure_process_time.c +7 -6
  14. data/ext/ruby_prof/rp_measurement.c +147 -20
  15. data/ext/ruby_prof/rp_measurement.h +4 -1
  16. data/ext/ruby_prof/rp_method.c +142 -83
  17. data/ext/ruby_prof/rp_method.h +63 -62
  18. data/ext/ruby_prof/rp_profile.c +933 -900
  19. data/ext/ruby_prof/rp_profile.h +1 -0
  20. data/ext/ruby_prof/rp_thread.c +433 -362
  21. data/ext/ruby_prof/rp_thread.h +39 -39
  22. data/ext/ruby_prof/ruby_prof.c +0 -2
  23. data/ext/ruby_prof/ruby_prof.h +8 -0
  24. data/ext/ruby_prof/vc/ruby_prof.vcxproj +11 -8
  25. data/lib/ruby-prof/assets/call_stack_printer.html.erb +2 -1
  26. data/lib/ruby-prof/compatibility.rb +14 -0
  27. data/lib/ruby-prof/method_info.rb +8 -1
  28. data/lib/ruby-prof/printers/abstract_printer.rb +2 -1
  29. data/lib/ruby-prof/printers/call_tree_printer.rb +4 -10
  30. data/lib/ruby-prof/printers/graph_html_printer.rb +1 -1
  31. data/lib/ruby-prof/printers/multi_printer.rb +17 -17
  32. data/lib/ruby-prof/profile.rb +70 -37
  33. data/lib/ruby-prof/rack.rb +31 -21
  34. data/lib/ruby-prof/version.rb +1 -1
  35. data/lib/ruby-prof.rb +1 -1
  36. data/ruby-prof.gemspec +2 -3
  37. data/test/abstract_printer_test.rb +1 -0
  38. data/test/alias_test.rb +97 -106
  39. data/test/call_tree_builder.rb +126 -0
  40. data/test/call_tree_test.rb +94 -0
  41. data/test/call_tree_visitor_test.rb +1 -6
  42. data/test/call_trees_test.rb +6 -6
  43. data/test/{basic_test.rb → compatibility_test.rb} +8 -2
  44. data/test/duplicate_names_test.rb +5 -5
  45. data/test/dynamic_method_test.rb +24 -15
  46. data/test/enumerable_test.rb +1 -1
  47. data/test/exceptions_test.rb +2 -2
  48. data/test/exclude_methods_test.rb +3 -8
  49. data/test/exclude_threads_test.rb +4 -9
  50. data/test/fiber_test.rb +74 -8
  51. data/test/gc_test.rb +11 -9
  52. data/test/inverse_call_tree_test.rb +33 -34
  53. data/test/line_number_test.rb +37 -61
  54. data/test/marshal_test.rb +16 -3
  55. data/test/measure_allocations.rb +1 -5
  56. data/test/measure_allocations_test.rb +642 -357
  57. data/test/{measure_memory_trace_test.rb → measure_memory_test.rb} +180 -616
  58. data/test/measure_process_time_test.rb +1566 -741
  59. data/test/measure_wall_time_test.rb +179 -193
  60. data/test/measurement_test.rb +82 -0
  61. data/test/merge_test.rb +146 -0
  62. data/test/method_info_test.rb +95 -0
  63. data/test/multi_printer_test.rb +0 -5
  64. data/test/no_method_class_test.rb +1 -1
  65. data/test/pause_resume_test.rb +12 -16
  66. data/test/printer_call_stack_test.rb +2 -2
  67. data/test/printer_call_tree_test.rb +4 -4
  68. data/test/printer_flat_test.rb +1 -1
  69. data/test/printer_graph_html_test.rb +2 -2
  70. data/test/printer_graph_test.rb +2 -2
  71. data/test/printers_test.rb +14 -20
  72. data/test/printing_recursive_graph_test.rb +2 -2
  73. data/test/profile_test.rb +85 -0
  74. data/test/recursive_test.rb +374 -155
  75. data/test/scheduler.rb +363 -0
  76. data/test/singleton_test.rb +1 -1
  77. data/test/stack_printer_test.rb +5 -8
  78. data/test/start_stop_test.rb +11 -14
  79. data/test/test_helper.rb +11 -8
  80. data/test/thread_test.rb +106 -15
  81. data/test/unique_call_path_test.rb +28 -12
  82. data/test/yarv_test.rb +11 -7
  83. metadata +17 -29
  84. data/ext/ruby_prof/rp_aggregate_call_tree.c +0 -59
  85. data/ext/ruby_prof/rp_aggregate_call_tree.h +0 -13
  86. data/test/measure_allocations_trace_test.rb +0 -375
  87. data/test/temp.rb +0 -20
data/test/fiber_test.rb CHANGED
@@ -8,7 +8,6 @@ require 'set'
8
8
 
9
9
  # -- Tests ----
10
10
  class FiberTest < TestCase
11
-
12
11
  def enumerator_with_fibers
13
12
  enum = Enumerator.new do |yielder|
14
13
  [1,2].each do |x|
@@ -30,13 +29,8 @@ class FiberTest < TestCase
30
29
  fiber.resume
31
30
  end
32
31
 
33
- def setup
34
- # Need to use wall time for this test due to the sleep calls
35
- RubyProf::measure_mode = RubyProf::WALL_TIME
36
- end
37
-
38
32
  def test_fibers
39
- result = RubyProf.profile { enumerator_with_fibers }
33
+ result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) { enumerator_with_fibers }
40
34
 
41
35
  assert_equal(2, result.threads.size)
42
36
 
@@ -47,46 +41,86 @@ class FiberTest < TestCase
47
41
  method = methods[0]
48
42
  assert_equal('FiberTest#test_fibers', method.full_name)
49
43
  assert_equal(1, method.called)
44
+ assert_in_delta(0, method.total_time)
45
+ assert_in_delta(0, method.self_time)
46
+ assert_in_delta(0, method.wait_time)
47
+ assert_in_delta(0, method.children_time)
50
48
 
51
49
  method = methods[1]
52
50
  assert_equal('FiberTest#enumerator_with_fibers', method.full_name)
53
51
  assert_equal(1, method.called)
52
+ assert_in_delta(0, method.total_time)
53
+ assert_in_delta(0, method.self_time)
54
+ assert_in_delta(0, method.wait_time)
55
+ assert_in_delta(0, method.children_time)
54
56
 
55
57
  method = methods[2]
56
58
  assert_equal('Enumerator#next', method.full_name)
57
59
  assert_equal(2, method.called)
60
+ assert_in_delta(0, method.total_time)
61
+ assert_in_delta(0, method.self_time)
62
+ assert_in_delta(0, method.wait_time)
63
+ assert_in_delta(0, method.children_time)
58
64
 
59
65
  method = methods[3]
60
66
  assert_equal('Class#new', method.full_name)
61
67
  assert_equal(1, method.called)
68
+ assert_in_delta(0, method.total_time)
69
+ assert_in_delta(0, method.self_time)
70
+ assert_in_delta(0, method.wait_time)
71
+ assert_in_delta(0, method.children_time)
62
72
 
63
73
  method = methods[4]
64
74
  assert_equal('Enumerator#initialize', method.full_name)
65
75
  assert_equal(1, method.called)
76
+ assert_in_delta(0, method.total_time)
77
+ assert_in_delta(0, method.self_time)
78
+ assert_in_delta(0, method.wait_time)
79
+ assert_in_delta(0, method.children_time)
66
80
 
67
81
  thread2 = result.threads[1]
68
82
  methods = thread2.methods.sort.reverse
69
83
  assert_equal(4, methods.count)
84
+ assert_in_delta(0, method.total_time)
85
+ assert_in_delta(0, method.self_time)
86
+ assert_in_delta(0, method.wait_time)
87
+ assert_in_delta(0, method.children_time)
70
88
 
71
89
  method = methods[0]
72
90
  assert_equal('Enumerator#each', method.full_name)
73
91
  assert_equal(1, method.called)
92
+ assert_in_delta(0, method.total_time)
93
+ assert_in_delta(0, method.self_time)
94
+ assert_in_delta(0, method.wait_time)
95
+ assert_in_delta(0, method.children_time)
74
96
 
75
97
  method = methods[1]
76
98
  assert_equal('Enumerator::Generator#each', method.full_name)
77
99
  assert_equal(1, method.called)
100
+ assert_in_delta(0, method.total_time)
101
+ assert_in_delta(0, method.self_time)
102
+ assert_in_delta(0, method.wait_time)
103
+ assert_in_delta(0, method.children_time)
78
104
 
79
105
  method = methods[2]
80
106
  assert_equal('Array#each', method.full_name)
81
107
  assert_equal(1, method.called)
108
+ assert_in_delta(0, method.total_time)
109
+ assert_in_delta(0, method.self_time)
110
+ assert_in_delta(0, method.wait_time)
111
+ assert_in_delta(0, method.children_time)
82
112
 
83
113
  method = methods[3]
84
114
  assert_equal('Enumerator::Yielder#yield', method.full_name)
85
115
  assert_equal(2, method.called)
116
+ assert_in_delta(0, method.total_time)
117
+ assert_in_delta(0, method.self_time)
118
+ assert_in_delta(0, method.wait_time)
119
+ assert_in_delta(0, method.children_time)
86
120
  end
87
121
 
88
122
  def test_fiber_resume
89
- result = RubyProf.profile { fiber_yield_resume }
123
+ result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) { fiber_yield_resume }
90
124
 
91
125
  assert_equal(2, result.threads.size)
92
126
 
@@ -97,33 +131,65 @@ class FiberTest < TestCase
97
131
  method = methods[0]
98
132
  assert_equal('FiberTest#test_fiber_resume', method.full_name)
99
133
  assert_equal(1, method.called)
134
+ assert_in_delta(0, method.total_time)
135
+ assert_in_delta(0, method.self_time)
136
+ assert_in_delta(0, method.wait_time)
137
+ assert_in_delta(0, method.children_time)
100
138
 
101
139
  method = methods[1]
102
140
  assert_equal('FiberTest#fiber_yield_resume', method.full_name)
103
141
  assert_equal(1, method.called)
142
+ assert_in_delta(0, method.total_time)
143
+ assert_in_delta(0, method.self_time)
144
+ assert_in_delta(0, method.wait_time)
145
+ assert_in_delta(0, method.children_time)
104
146
 
105
147
  method = methods[2]
106
148
  assert_equal('Fiber#resume', method.full_name)
107
149
  assert_equal(2, method.called)
150
+ assert_in_delta(0, method.total_time)
151
+ assert_in_delta(0, method.self_time)
152
+ assert_in_delta(0, method.wait_time)
153
+ assert_in_delta(0, method.children_time)
108
154
 
109
155
  method = methods[3]
110
156
  assert_equal('Class#new', method.full_name)
111
157
  assert_equal(1, method.called)
158
+ assert_in_delta(0, method.total_time)
159
+ assert_in_delta(0, method.self_time)
160
+ assert_in_delta(0, method.wait_time)
161
+ assert_in_delta(0, method.children_time)
112
162
 
113
163
  method = methods[4]
114
164
  assert_equal('Fiber#initialize', method.full_name)
115
165
  assert_equal(1, method.called)
166
+ assert_in_delta(0, method.total_time)
167
+ assert_in_delta(0, method.self_time)
168
+ assert_in_delta(0, method.wait_time)
169
+ assert_in_delta(0, method.children_time)
116
170
 
117
171
  thread1 = result.threads[1]
118
172
  methods = thread1.methods.sort.reverse
119
173
  assert_equal(2, methods.count)
174
+ assert_in_delta(0, method.total_time)
175
+ assert_in_delta(0, method.self_time)
176
+ assert_in_delta(0, method.wait_time)
177
+ assert_in_delta(0, method.children_time)
120
178
 
121
179
  method = methods[0]
122
180
  assert_equal('FiberTest#fiber_yield_resume', method.full_name)
123
181
  assert_equal(1, method.called)
182
+ assert_in_delta(0, method.total_time)
183
+ assert_in_delta(0, method.self_time)
184
+ assert_in_delta(0, method.wait_time)
185
+ assert_in_delta(0, method.children_time)
124
186
 
125
187
  method = methods[1]
126
188
  assert_equal('<Class::Fiber>#yield', method.full_name)
127
189
  assert_equal(2, method.called)
190
+ assert_in_delta(0, method.total_time)
191
+ assert_in_delta(0, method.self_time)
192
+ assert_in_delta(0, method.wait_time)
193
+ assert_in_delta(0, method.children_time)
128
194
  end
129
195
  end
data/test/gc_test.rb CHANGED
@@ -6,6 +6,7 @@ Minitest::Test.i_suck_and_my_tests_are_order_dependent!
6
6
 
7
7
  class GcTest < TestCase
8
8
  def setup
9
+ super
9
10
  GC.stress = true
10
11
  end
11
12
 
@@ -18,7 +19,7 @@ class GcTest < TestCase
18
19
  end
19
20
 
20
21
  def run_profile
21
- RubyProf.profile do
22
+ RubyProf::Profile.profile do
22
23
  self.some_method
23
24
  end
24
25
  end
@@ -36,7 +37,6 @@ class GcTest < TestCase
36
37
  end
37
38
  end
38
39
 
39
-
40
40
  def test_hold_onto_method
41
41
  methods = 5.times.reduce(Array.new) do |array, i|
42
42
  profile = run_profile
@@ -67,16 +67,18 @@ class GcTest < TestCase
67
67
  end
68
68
 
69
69
  def test_hold_onto_measurements
70
- measurements = 5.times.reduce(Array.new) do |array, i|
71
- profile = run_profile
72
- measurements_2 = profile.threads.map(&:methods).flatten.map(&:measurement)
73
- array.concat(measurements_2)
74
- array
75
- end
70
+ # Run a profile
71
+ profile = run_profile
72
+
73
+ # Get measurement objects
74
+ measurements = profile.threads.map(&:methods).flatten.map(&:measurement)
75
+
76
+ # Free the profiles which frees the measurements
77
+ profile = nil
76
78
 
77
79
  GC.start
78
80
 
79
- measurements.each do |measurement|
81
+ measurements.each_with_index do |measurement|
80
82
  error = assert_raises(RuntimeError) do
81
83
  measurement.total_time
82
84
  end
@@ -4,18 +4,17 @@
4
4
  require File.expand_path('../test_helper', __FILE__)
5
5
 
6
6
  class InverseCallTreeTest < TestCase
7
- INVERSE_DEPTH = 5
8
-
9
7
  def setup
10
- # Need to use wall time for this test due to the sleep calls
11
- RubyProf::measure_mode = RubyProf::WALL_TIME
8
+ super
9
+ @profile = RubyProf::Profile.new
12
10
  end
11
+ INVERSE_DEPTH = 5
13
12
 
14
13
  INVERSE_DEPTH.times do |i|
15
14
  if i == 0
16
15
  define_method("method_#{i}") do
17
16
  sleep_amount = (i + 1) * 0.05
18
- RubyProf.start
17
+ @profile.start
19
18
  sleep(sleep_amount)
20
19
  end
21
20
  else
@@ -31,11 +30,11 @@ class InverseCallTreeTest < TestCase
31
30
  def test_inverse
32
31
  method_name = "method_#{INVERSE_DEPTH - 1}"
33
32
  self.send(method_name.to_sym)
34
- profile = RubyProf.stop
33
+ result = @profile.stop
35
34
 
36
- assert_equal(1, profile.threads.count)
35
+ assert_equal(1, result.threads.count)
37
36
 
38
- thread = profile.threads.first
37
+ thread = result.threads.first
39
38
  assert_in_delta(0.79, thread.total_time, 0.05)
40
39
 
41
40
  assert_equal(7, thread.methods.length)
@@ -44,29 +43,29 @@ class InverseCallTreeTest < TestCase
44
43
  # InverseCallTreeTest#test_inverse
45
44
  method = methods[0]
46
45
  assert_equal('InverseCallTreeTest#test_inverse', method.full_name)
47
- assert_equal(34, method.line)
46
+ assert_equal(33, method.line)
48
47
 
49
48
  assert_equal(0, method.call_trees.callers.count)
50
49
 
51
50
  assert_equal(1, method.call_trees.callees.count)
52
51
  call_tree = method.call_trees.callees[0]
53
52
  assert_equal('InverseCallTreeTest#method_4', call_tree.target.full_name)
54
- assert_equal(26, call_tree.line)
53
+ assert_equal(25, call_tree.line)
55
54
 
56
55
  # InverseCallTreeTest#method_4
57
56
  method = methods[1]
58
57
  assert_equal('InverseCallTreeTest#method_4', method.full_name)
59
- assert_equal(26, method.line)
58
+ assert_equal(25, method.line)
60
59
 
61
60
  assert_equal(1, method.call_trees.callers.count)
62
61
  call_tree = method.call_trees.callers[0]
63
62
  assert_equal('InverseCallTreeTest#test_inverse', call_tree.parent.target.full_name)
64
- assert_equal(26, call_tree.line)
63
+ assert_equal(25, call_tree.line)
65
64
 
66
65
  assert_equal(2, method.call_trees.callees.count)
67
66
  call_tree = method.call_trees.callees[0]
68
67
  assert_equal('InverseCallTreeTest#method_3', call_tree.target.full_name)
69
- assert_equal(26, call_tree.line)
68
+ assert_equal(25, call_tree.line)
70
69
 
71
70
  # Kernel#sleep
72
71
  method = methods[2]
@@ -76,100 +75,100 @@ class InverseCallTreeTest < TestCase
76
75
  assert_equal(5, method.call_trees.callers.count)
77
76
  call_tree = method.call_trees.callers[0]
78
77
  assert_equal('InverseCallTreeTest#method_0', call_tree.parent.target.full_name)
79
- assert_equal(19, call_tree.line)
78
+ assert_equal(18, call_tree.line)
80
79
 
81
80
  call_tree = method.call_trees.callers[1]
82
81
  assert_equal('InverseCallTreeTest#method_1', call_tree.parent.target.full_name)
83
- assert_equal(26, call_tree.line)
82
+ assert_equal(25, call_tree.line)
84
83
 
85
84
  call_tree = method.call_trees.callers[2]
86
85
  assert_equal('InverseCallTreeTest#method_2', call_tree.parent.target.full_name)
87
- assert_equal(26, call_tree.line)
86
+ assert_equal(25, call_tree.line)
88
87
  call_tree = method.call_trees.callers[3]
89
88
 
90
89
  assert_equal('InverseCallTreeTest#method_3', call_tree.parent.target.full_name)
91
- assert_equal(26, call_tree.line)
90
+ assert_equal(25, call_tree.line)
92
91
 
93
92
  call_tree = method.call_trees.callers[4]
94
93
  assert_equal('InverseCallTreeTest#method_4', call_tree.parent.target.full_name)
95
- assert_equal(26, call_tree.line)
94
+ assert_equal(25, call_tree.line)
96
95
 
97
96
  assert_equal(0, method.call_trees.callees.count)
98
97
 
99
98
  # InverseCallTreeTest#method_3
100
99
  method = methods[3]
101
100
  assert_equal('InverseCallTreeTest#method_3', method.full_name)
102
- assert_equal(26, method.line)
101
+ assert_equal(25, method.line)
103
102
 
104
103
  assert_equal(1, method.call_trees.callers.count)
105
104
  call_tree = method.call_trees.callers[0]
106
105
  assert_equal('InverseCallTreeTest#method_4', call_tree.parent.target.full_name)
107
- assert_equal(26, call_tree.line)
106
+ assert_equal(25, call_tree.line)
108
107
 
109
108
  assert_equal(2, method.call_trees.callees.count)
110
109
  call_tree = method.call_trees.callees[0]
111
110
  assert_equal('InverseCallTreeTest#method_2', call_tree.target.full_name)
112
- assert_equal(26, call_tree.line)
111
+ assert_equal(25, call_tree.line)
113
112
 
114
113
  call_tree = method.call_trees.callees[1]
115
114
  assert_equal('Kernel#sleep', call_tree.target.full_name)
116
- assert_equal(26, call_tree.line)
115
+ assert_equal(25, call_tree.line)
117
116
 
118
117
  # InverseCallTreeTest#method_2
119
118
  method = methods[4]
120
119
  assert_equal('InverseCallTreeTest#method_2', method.full_name)
121
- assert_equal(26, method.line)
120
+ assert_equal(25, method.line)
122
121
 
123
122
  assert_equal(1, method.call_trees.callers.count)
124
123
  call_tree = method.call_trees.callers[0]
125
124
  assert_equal('InverseCallTreeTest#method_3', call_tree.parent.target.full_name)
126
- assert_equal(26, call_tree.line)
125
+ assert_equal(25, call_tree.line)
127
126
 
128
127
  assert_equal(2, method.call_trees.callees.count)
129
128
  call_tree = method.call_trees.callees[0]
130
129
  assert_equal('InverseCallTreeTest#method_1', call_tree.target.full_name)
131
- assert_equal(26, call_tree.line)
130
+ assert_equal(25, call_tree.line)
132
131
 
133
132
  call_tree = method.call_trees.callees[1]
134
133
  assert_equal('Kernel#sleep', call_tree.target.full_name)
135
- assert_equal(26, call_tree.line)
134
+ assert_equal(25, call_tree.line)
136
135
 
137
136
  call_tree = method.call_trees.callees[1]
138
137
  assert_equal('Kernel#sleep', call_tree.target.full_name)
139
- assert_equal(26, call_tree.line)
138
+ assert_equal(25, call_tree.line)
140
139
 
141
140
  # InverseCallTreeTest#method_1
142
141
  method = methods[5]
143
142
  assert_equal('InverseCallTreeTest#method_1', method.full_name)
144
- assert_equal(26, method.line)
143
+ assert_equal(25, method.line)
145
144
 
146
145
  assert_equal(1, method.call_trees.callers.count)
147
146
  call_tree = method.call_trees.callers[0]
148
147
  assert_equal('InverseCallTreeTest#method_2', call_tree.parent.target.full_name)
149
- assert_equal(26, call_tree.line)
148
+ assert_equal(25, call_tree.line)
150
149
 
151
150
  assert_equal(2, method.call_trees.callees.count)
152
151
  call_tree = method.call_trees.callees[0]
153
152
  assert_equal('InverseCallTreeTest#method_0', call_tree.target.full_name)
154
- assert_equal(19, call_tree.line)
153
+ assert_equal(18, call_tree.line)
155
154
 
156
155
  call_tree = method.call_trees.callees[1]
157
156
  assert_equal('Kernel#sleep', call_tree.target.full_name)
158
- assert_equal(26, call_tree.line)
157
+ assert_equal(25, call_tree.line)
159
158
 
160
159
  # InverseCallTreeTest#method_0
161
160
  method = methods[6]
162
161
  assert_equal('InverseCallTreeTest#method_0', method.full_name)
163
- assert_equal(19, method.line)
162
+ assert_equal(18, method.line)
164
163
 
165
164
  assert_equal(1, method.call_trees.callers.count)
166
165
  call_tree = method.call_trees.callers[0]
167
166
  assert_equal('InverseCallTreeTest#method_1', call_tree.parent.target.full_name)
168
- assert_equal(19, call_tree.line)
167
+ assert_equal(18, call_tree.line)
169
168
 
170
169
  assert_equal(1, method.call_trees.callees.count)
171
170
  call_tree = method.call_trees.callees[0]
172
171
  assert_equal('Kernel#sleep', call_tree.target.full_name)
173
- assert_equal(19, call_tree.line)
172
+ assert_equal(18, call_tree.line)
174
173
  end
175
174
  end
@@ -19,12 +19,10 @@ class LineNumbers
19
19
  end
20
20
 
21
21
  def method_3
22
- sleep(0.3)
23
22
  method_4
24
23
  end
25
24
 
26
25
  def method_4
27
- sleep(1.2)
28
26
  end
29
27
  end
30
28
 
@@ -33,24 +31,28 @@ class LineNumbersTest < TestCase
33
31
  def test_function_line_no
34
32
  numbers = LineNumbers.new
35
33
 
36
- result = RubyProf.profile do
34
+ result = RubyProf::Profile.profile do
37
35
  numbers.method_1
38
36
  end
39
37
 
40
- methods = result.threads.first.methods.sort.reverse
41
- assert_equal(7, methods.length)
38
+ # Sort methods by name to have stable results
39
+ methods = result.threads.first.methods.sort_by(&:full_name)
40
+ assert_equal(6, methods.length)
42
41
 
43
42
  # Method 0
44
43
  method = methods[0]
45
- assert_equal('LineNumbersTest#test_function_line_no', method.full_name)
46
- assert_equal(37, method.line)
44
+ assert_equal('Integer#times', method.full_name)
45
+ assert_equal(0, method.line)
47
46
 
48
- assert_equal(0, method.call_trees.callers.count)
47
+ assert_equal(1, method.call_trees.callers.count)
48
+ call_tree = method.call_trees.callers[0]
49
+ assert_equal('LineNumbers#method_2', call_tree.parent.target.full_name)
50
+ assert_equal(15, call_tree.line)
49
51
 
50
52
  assert_equal(1, method.call_trees.callees.count)
51
53
  call_tree = method.call_trees.callees[0]
52
- assert_equal('LineNumbers#method_1', call_tree.target.full_name)
53
- assert_equal(37, call_tree.line)
54
+ assert_equal('LineNumbers#method_3', call_tree.target.full_name)
55
+ assert_equal(17, call_tree.line)
54
56
 
55
57
  # Method 1
56
58
  method = methods[1]
@@ -60,7 +62,7 @@ class LineNumbersTest < TestCase
60
62
  assert_equal(1, method.call_trees.callers.count)
61
63
  call_tree = method.call_trees.callers[0]
62
64
  assert_equal('LineNumbersTest#test_function_line_no', call_tree.parent.target.full_name)
63
- assert_equal(37, call_tree.line)
65
+ assert_equal(35, call_tree.line)
64
66
 
65
67
  assert_equal(2, method.call_trees.callees.count)
66
68
  call_tree = method.call_trees.callees[0]
@@ -73,6 +75,21 @@ class LineNumbersTest < TestCase
73
75
 
74
76
  # Method 2
75
77
  method = methods[2]
78
+ assert_equal('LineNumbers#method_2', method.full_name)
79
+ assert_equal(13, method.line)
80
+
81
+ assert_equal(1, method.call_trees.callers.count)
82
+ call_tree = method.call_trees.callers[0]
83
+ assert_equal('LineNumbers#method_1', call_tree.parent.target.full_name)
84
+ assert_equal(8, call_tree.line)
85
+
86
+ assert_equal(1, method.call_trees.callees.count)
87
+ call_tree = method.call_trees.callees[0]
88
+ assert_equal('Integer#times', call_tree.target.full_name)
89
+ assert_equal(15, call_tree.line)
90
+
91
+ # Method 3
92
+ method = methods[3]
76
93
  assert_equal('LineNumbers#method_3', method.full_name)
77
94
  assert_equal(21, method.line)
78
95
 
@@ -85,74 +102,33 @@ class LineNumbersTest < TestCase
85
102
  assert_equal('LineNumbers#method_1', call_tree.parent.target.full_name)
86
103
  assert_equal(10, call_tree.line)
87
104
 
88
- assert_equal(2, method.call_trees.callees.count)
105
+ assert_equal(1, method.call_trees.callees.count)
89
106
  call_tree = method.call_trees.callees[0]
90
- assert_equal('Kernel#sleep', call_tree.target.full_name)
91
- assert_equal(22, call_tree.line)
92
-
93
- call_tree = method.call_trees.callees[1]
94
107
  assert_equal('LineNumbers#method_4', call_tree.target.full_name)
95
- assert_equal(23, call_tree.line)
96
-
97
- # Method 3
98
- method = methods[3]
99
- assert_equal('Kernel#sleep', method.full_name)
100
- assert_equal(0, method.line)
101
-
102
- assert_equal(2, method.call_trees.callers.count)
103
- call_tree = method.call_trees.callers[0]
104
- assert_equal('LineNumbers#method_3', call_tree.parent.target.full_name)
105
108
  assert_equal(22, call_tree.line)
106
109
 
107
- call_tree = method.call_trees.callers[1]
108
- assert_equal('LineNumbers#method_4', call_tree.parent.target.full_name)
109
- assert_equal(27, call_tree.line)
110
-
111
- assert_equal(0, method.call_trees.callees.count)
112
-
113
110
  # Method 4
114
111
  method = methods[4]
115
112
  assert_equal('LineNumbers#method_4', method.full_name)
116
- assert_equal(26, method.line)
113
+ assert_equal(25, method.line)
117
114
 
118
115
  assert_equal(1, method.call_trees.callers.count)
119
116
  call_tree = method.call_trees.callers[0]
120
117
  assert_equal('LineNumbers#method_3', call_tree.parent.target.full_name)
121
- assert_equal(23, call_tree.line)
118
+ assert_equal(22, call_tree.line)
122
119
 
123
- assert_equal(1, method.call_trees.callees.count)
124
- call_tree = method.call_trees.callees[0]
125
- assert_equal('Kernel#sleep', call_tree.target.full_name)
126
- assert_equal(27, call_tree.line)
120
+ assert_equal(0, method.call_trees.callees.count)
127
121
 
128
122
  # Method 5
129
123
  method = methods[5]
130
- assert_equal('LineNumbers#method_2', method.full_name)
131
- assert_equal(13, method.line)
132
-
133
- assert_equal(1, method.call_trees.callers.count)
134
- call_tree = method.call_trees.callers[0]
135
- assert_equal('LineNumbers#method_1', call_tree.parent.target.full_name)
136
- assert_equal(8, call_tree.line)
137
-
138
- assert_equal(1, method.call_trees.callees.count)
139
- call_tree = method.call_trees.callees[0]
140
- assert_equal('Integer#times', call_tree.target.full_name)
141
- assert_equal(15, call_tree.line)
142
-
143
- # Method 6
144
- method = methods[6]
145
- assert_equal('Integer#times', method.full_name)
146
- assert_equal(0, method.line)
124
+ assert_equal('LineNumbersTest#test_function_line_no', method.full_name)
125
+ assert_equal(35, method.line)
147
126
 
148
- assert_equal(1, method.call_trees.callers.count)
149
- call_tree = method.call_trees.callers[0]
150
- assert_equal('LineNumbers#method_2', call_tree.parent.target.full_name)
151
- assert_equal(15, call_tree.line)
127
+ assert_equal(0, method.call_trees.callers.count)
152
128
 
153
129
  assert_equal(1, method.call_trees.callees.count)
154
130
  call_tree = method.call_trees.callees[0]
155
- assert_equal('LineNumbers#method_3', call_tree.target.full_name)
156
- assert_equal(17, call_tree.line)
131
+ assert_equal('LineNumbers#method_1', call_tree.target.full_name)
132
+ assert_equal(35, call_tree.line)
157
133
  end
158
134
  end
data/test/marshal_test.rb CHANGED
@@ -5,6 +5,8 @@ require File.expand_path("../test_helper", __FILE__)
5
5
  class MarshalTest < TestCase
6
6
  def verify_profile(profile_1, profile_2)
7
7
  verify_threads(profile_1.threads, profile_2.threads)
8
+ assert_equal(profile_1.measure_mode, profile_2.measure_mode)
9
+ assert_equal(profile_1.track_allocations?, profile_2.track_allocations?)
8
10
  end
9
11
 
10
12
  def verify_threads(threads_1, threads_2)
@@ -108,8 +110,19 @@ class MarshalTest < TestCase
108
110
  assert_equal(measurement_1.called, measurement_2.called)
109
111
  end
110
112
 
111
- def test_marshal
112
- profile_1 = RubyProf.profile do
113
+ def test_marshal_1
114
+ profile_1 = RubyProf::Profile.profile(:measure_mode => RubyProf::WALL_TIME) do
115
+ 1.times { RubyProf::C1.new.sleep_wait }
116
+ end
117
+
118
+ data = Marshal.dump(profile_1)
119
+ profile_2 = Marshal.load(data)
120
+
121
+ verify_profile(profile_1, profile_2)
122
+ end
123
+
124
+ def test_marshal_2
125
+ profile_1 = RubyProf::Profile.profile(:measure_mode => RubyProf::PROCESS_TIME, :track_allocations => true) do
113
126
  1.times { RubyProf::C1.new.sleep_wait }
114
127
  end
115
128
 
@@ -120,7 +133,7 @@ class MarshalTest < TestCase
120
133
  end
121
134
 
122
135
  def test_singleton
123
- profile_1 = RubyProf.profile do
136
+ profile_1 = RubyProf::Profile.profile do
124
137
  SingletonTest.instance.busy_wait
125
138
  end
126
139
 
@@ -18,13 +18,9 @@ class Allocator
18
18
  String.new(b_string)
19
19
  end
20
20
 
21
- def internal_run
21
+ def run
22
22
  make_arrays
23
23
  make_hashes
24
24
  make_strings
25
25
  end
26
-
27
- def run
28
- internal_run
29
- end
30
26
  end