ruby-prof 0.18.0-x64-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 (108) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGES +500 -0
  3. data/LICENSE +25 -0
  4. data/README.rdoc +487 -0
  5. data/Rakefile +113 -0
  6. data/bin/ruby-prof +345 -0
  7. data/bin/ruby-prof-check-trace +45 -0
  8. data/examples/flat.txt +50 -0
  9. data/examples/graph.dot +84 -0
  10. data/examples/graph.html +823 -0
  11. data/examples/graph.txt +139 -0
  12. data/examples/multi.flat.txt +23 -0
  13. data/examples/multi.graph.html +760 -0
  14. data/examples/multi.grind.dat +114 -0
  15. data/examples/multi.stack.html +547 -0
  16. data/examples/stack.html +547 -0
  17. data/ext/ruby_prof/extconf.rb +68 -0
  18. data/ext/ruby_prof/rp_call_info.c +425 -0
  19. data/ext/ruby_prof/rp_call_info.h +53 -0
  20. data/ext/ruby_prof/rp_measure.c +40 -0
  21. data/ext/ruby_prof/rp_measure.h +45 -0
  22. data/ext/ruby_prof/rp_measure_allocations.c +76 -0
  23. data/ext/ruby_prof/rp_measure_cpu_time.c +136 -0
  24. data/ext/ruby_prof/rp_measure_gc_runs.c +73 -0
  25. data/ext/ruby_prof/rp_measure_gc_time.c +60 -0
  26. data/ext/ruby_prof/rp_measure_memory.c +77 -0
  27. data/ext/ruby_prof/rp_measure_process_time.c +71 -0
  28. data/ext/ruby_prof/rp_measure_wall_time.c +45 -0
  29. data/ext/ruby_prof/rp_method.c +630 -0
  30. data/ext/ruby_prof/rp_method.h +75 -0
  31. data/ext/ruby_prof/rp_stack.c +173 -0
  32. data/ext/ruby_prof/rp_stack.h +63 -0
  33. data/ext/ruby_prof/rp_thread.c +277 -0
  34. data/ext/ruby_prof/rp_thread.h +27 -0
  35. data/ext/ruby_prof/ruby_prof.c +794 -0
  36. data/ext/ruby_prof/ruby_prof.h +60 -0
  37. data/ext/ruby_prof/vc/ruby_prof.sln +31 -0
  38. data/ext/ruby_prof/vc/ruby_prof.vcxproj +141 -0
  39. data/lib/2.6.3/ruby_prof.so +0 -0
  40. data/lib/ruby-prof.rb +68 -0
  41. data/lib/ruby-prof/aggregate_call_info.rb +76 -0
  42. data/lib/ruby-prof/assets/call_stack_printer.css.html +117 -0
  43. data/lib/ruby-prof/assets/call_stack_printer.js.html +385 -0
  44. data/lib/ruby-prof/assets/call_stack_printer.png +0 -0
  45. data/lib/ruby-prof/call_info.rb +115 -0
  46. data/lib/ruby-prof/call_info_visitor.rb +40 -0
  47. data/lib/ruby-prof/compatibility.rb +179 -0
  48. data/lib/ruby-prof/method_info.rb +121 -0
  49. data/lib/ruby-prof/printers/abstract_printer.rb +104 -0
  50. data/lib/ruby-prof/printers/call_info_printer.rb +41 -0
  51. data/lib/ruby-prof/printers/call_stack_printer.rb +265 -0
  52. data/lib/ruby-prof/printers/call_tree_printer.rb +143 -0
  53. data/lib/ruby-prof/printers/dot_printer.rb +132 -0
  54. data/lib/ruby-prof/printers/flat_printer.rb +70 -0
  55. data/lib/ruby-prof/printers/flat_printer_with_line_numbers.rb +83 -0
  56. data/lib/ruby-prof/printers/graph_html_printer.rb +249 -0
  57. data/lib/ruby-prof/printers/graph_printer.rb +116 -0
  58. data/lib/ruby-prof/printers/multi_printer.rb +84 -0
  59. data/lib/ruby-prof/profile.rb +26 -0
  60. data/lib/ruby-prof/profile/exclude_common_methods.rb +207 -0
  61. data/lib/ruby-prof/profile/legacy_method_elimination.rb +50 -0
  62. data/lib/ruby-prof/rack.rb +174 -0
  63. data/lib/ruby-prof/task.rb +147 -0
  64. data/lib/ruby-prof/thread.rb +35 -0
  65. data/lib/ruby-prof/version.rb +3 -0
  66. data/lib/unprof.rb +10 -0
  67. data/ruby-prof.gemspec +58 -0
  68. data/test/abstract_printer_test.rb +53 -0
  69. data/test/aggregate_test.rb +136 -0
  70. data/test/basic_test.rb +128 -0
  71. data/test/block_test.rb +74 -0
  72. data/test/call_info_test.rb +78 -0
  73. data/test/call_info_visitor_test.rb +31 -0
  74. data/test/duplicate_names_test.rb +32 -0
  75. data/test/dynamic_method_test.rb +55 -0
  76. data/test/enumerable_test.rb +21 -0
  77. data/test/exceptions_test.rb +24 -0
  78. data/test/exclude_methods_test.rb +146 -0
  79. data/test/exclude_threads_test.rb +53 -0
  80. data/test/fiber_test.rb +79 -0
  81. data/test/issue137_test.rb +63 -0
  82. data/test/line_number_test.rb +80 -0
  83. data/test/measure_allocations_test.rb +26 -0
  84. data/test/measure_cpu_time_test.rb +212 -0
  85. data/test/measure_gc_runs_test.rb +32 -0
  86. data/test/measure_gc_time_test.rb +36 -0
  87. data/test/measure_memory_test.rb +33 -0
  88. data/test/measure_process_time_test.rb +61 -0
  89. data/test/measure_wall_time_test.rb +255 -0
  90. data/test/method_elimination_test.rb +84 -0
  91. data/test/module_test.rb +45 -0
  92. data/test/multi_printer_test.rb +104 -0
  93. data/test/no_method_class_test.rb +15 -0
  94. data/test/pause_resume_test.rb +166 -0
  95. data/test/prime.rb +54 -0
  96. data/test/printers_test.rb +275 -0
  97. data/test/printing_recursive_graph_test.rb +127 -0
  98. data/test/rack_test.rb +157 -0
  99. data/test/recursive_test.rb +215 -0
  100. data/test/singleton_test.rb +38 -0
  101. data/test/stack_printer_test.rb +77 -0
  102. data/test/stack_test.rb +138 -0
  103. data/test/start_stop_test.rb +112 -0
  104. data/test/test_helper.rb +267 -0
  105. data/test/thread_test.rb +187 -0
  106. data/test/unique_call_path_test.rb +202 -0
  107. data/test/yarv_test.rb +55 -0
  108. metadata +199 -0
@@ -0,0 +1,212 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+
6
+ class MeasureCpuTimeTest < TestCase
7
+ def setup
8
+ RubyProf::measure_mode = RubyProf::CPU_TIME
9
+ end
10
+
11
+ def teardown
12
+ RubyProf::measure_mode = RubyProf::WALL_TIME
13
+ end
14
+
15
+ def test_mode
16
+ assert_equal(RubyProf::CPU_TIME, RubyProf::measure_mode)
17
+ end
18
+
19
+ def test_cpu_time_enabled_defined
20
+ assert(defined?(RubyProf::CPU_TIME_ENABLED))
21
+ end
22
+
23
+ def test_class_methods
24
+ result = RubyProf.profile do
25
+ RubyProf::C7.busy_wait
26
+ end
27
+
28
+ # Length should be greater 2:
29
+ # MeasureCpuTimeTest#test_class_methods
30
+ # <Class::RubyProf::C1>#busy_wait
31
+ # ....
32
+
33
+ methods = result.threads.first.methods.sort.reverse[0..1]
34
+ assert_equal(2, methods.length)
35
+
36
+ # Check the names
37
+ assert_equal('MeasureCpuTimeTest#test_class_methods', methods[0].full_name)
38
+ assert_equal('<Class::RubyProf::C7>#busy_wait', methods[1].full_name)
39
+
40
+ # Check times
41
+ assert_in_delta(0.1, methods[0].total_time, 0.05)
42
+ assert_in_delta(0, methods[0].wait_time, 0.05)
43
+ assert_in_delta(0, methods[0].self_time, 0.05)
44
+
45
+ assert_in_delta(0.1, methods[1].total_time, 0.05)
46
+ assert_in_delta(0, methods[1].wait_time, 0.05)
47
+ assert_in_delta(0, methods[1].self_time, 0.05)
48
+ end
49
+
50
+ def test_instance_methods
51
+ result = RubyProf.profile do
52
+ RubyProf::C7.new.busy_wait
53
+ end
54
+
55
+ methods = result.threads.first.methods.sort.reverse[0..1]
56
+ assert_equal(2, methods.length)
57
+
58
+ # Methods at this point:
59
+ # MeasureCpuTimeTest#test_instance_methods
60
+ # C7#busy_wait
61
+ # ...
62
+
63
+ names = methods.map(&:full_name)
64
+ assert_equal('MeasureCpuTimeTest#test_instance_methods', names[0])
65
+ assert_equal('RubyProf::C7#busy_wait', names[1])
66
+
67
+
68
+ # Check times
69
+ assert_in_delta(0.2, methods[0].total_time, 0.03)
70
+ assert_in_delta(0, methods[0].wait_time, 0.03)
71
+ assert_in_delta(0, methods[0].self_time, 0.03)
72
+
73
+ assert_in_delta(0.2, methods[1].total_time, 0.03)
74
+ assert_in_delta(0, methods[1].wait_time, 0.03)
75
+ assert_in_delta(0, methods[1].self_time, 0.2)
76
+ end
77
+
78
+ def test_module_methods
79
+ result = RubyProf.profile do
80
+ RubyProf::C8.busy_wait
81
+ end
82
+
83
+ # Methods:
84
+ # MeasureCpuTimeTest#test_module_methods
85
+ # M1#busy_wait
86
+ # ...
87
+
88
+ methods = result.threads.first.methods.sort.reverse[0..1]
89
+ assert_equal(2, methods.length)
90
+
91
+ assert_equal('MeasureCpuTimeTest#test_module_methods', methods[0].full_name)
92
+ assert_equal('RubyProf::M7#busy_wait', methods[1].full_name)
93
+
94
+ # Check times
95
+ assert_in_delta(0.3, methods[0].total_time, 0.1)
96
+ assert_in_delta(0, methods[0].wait_time, 0.02)
97
+ assert_in_delta(0, methods[0].self_time, 0.02)
98
+
99
+ assert_in_delta(0.3, methods[1].total_time, 0.1)
100
+ assert_in_delta(0, methods[1].wait_time, 0.02)
101
+ assert_in_delta(0, methods[1].self_time, 0.1)
102
+ end
103
+
104
+ def test_module_instance_methods
105
+ result = RubyProf.profile do
106
+ RubyProf::C8.new.busy_wait
107
+ end
108
+
109
+ # Methods:
110
+ # MeasureCpuTimeTest#test_module_instance_methods
111
+ # M7#busy_wait
112
+ # ...
113
+
114
+ methods = result.threads.first.methods.sort.reverse[0..1]
115
+ assert_equal(2, methods.length)
116
+ names = methods.map(&:full_name)
117
+ assert_equal('MeasureCpuTimeTest#test_module_instance_methods', names[0])
118
+ assert_equal('RubyProf::M7#busy_wait', names[1])
119
+
120
+ # Check times
121
+ assert_in_delta(0.3, methods[0].total_time, 0.1)
122
+ assert_in_delta(0, methods[0].wait_time, 0.1)
123
+ assert_in_delta(0, methods[0].self_time, 0.1)
124
+
125
+ assert_in_delta(0.3, methods[1].total_time, 0.1)
126
+ assert_in_delta(0, methods[1].wait_time, 0.01)
127
+ assert_in_delta(0, methods[1].self_time, 0.1)
128
+ end
129
+
130
+ def test_singleton
131
+ c3 = RubyProf::C3.new
132
+
133
+ class << c3
134
+ def busy_wait
135
+ end
136
+ end
137
+
138
+ result = RubyProf.profile do
139
+ c3.busy_wait
140
+ end
141
+
142
+ methods = result.threads.first.methods.sort.reverse
143
+ assert_equal(2, methods.length)
144
+
145
+ assert_equal('MeasureCpuTimeTest#test_singleton', methods[0].full_name)
146
+ assert_equal('<Object::RubyProf::C3>#busy_wait', methods[1].full_name)
147
+
148
+ assert_in_delta(0, methods[0].total_time, 0.01)
149
+ assert_in_delta(0, methods[0].wait_time, 0.01)
150
+ assert_in_delta(0, methods[0].self_time, 0.01)
151
+
152
+ assert_in_delta(0, methods[1].total_time, 0.01)
153
+ assert_in_delta(0, methods[1].wait_time, 0.01)
154
+ assert_in_delta(0, methods[1].self_time, 0.01)
155
+ end
156
+
157
+
158
+ def test_sleeping_does_accumulate_wall_time
159
+ RubyProf::measure_mode = RubyProf::WALL_TIME
160
+ result = RubyProf.profile do
161
+ sleep 0.1
162
+ end
163
+ methods = result.threads.first.methods.sort.reverse
164
+ assert_equal(["MeasureCpuTimeTest#test_sleeping_does_accumulate_wall_time", "Kernel#sleep"], methods.map(&:full_name))
165
+ assert_in_delta(0.1, methods[1].total_time, 0.01)
166
+ assert_equal(0, methods[1].wait_time)
167
+ assert_in_delta(0.1, methods[1].self_time, 0.01)
168
+ end
169
+
170
+ def test_sleeping_does_not_accumulate_significant_cpu_time
171
+ result = RubyProf.profile do
172
+ sleep 0.1
173
+ end
174
+ methods = result.threads.first.methods.sort.reverse
175
+ assert_equal(["MeasureCpuTimeTest#test_sleeping_does_not_accumulate_significant_cpu_time", "Kernel#sleep"], methods.map(&:full_name))
176
+ assert_in_delta(0, methods[1].total_time, 0.01)
177
+ assert_equal(0, methods[1].wait_time)
178
+ assert_in_delta(0, methods[1].self_time, 0.01)
179
+ end
180
+
181
+ def test_waiting_for_threads_does_not_accumulate_cpu_time
182
+ background_thread = nil
183
+ result = RubyProf.profile do
184
+ background_thread = Thread.new{ sleep 0.1 }
185
+ background_thread.join
186
+ end
187
+ # check number of threads
188
+ assert_equal(2, result.threads.length)
189
+ fg, bg = result.threads
190
+ assert(fg.methods.map(&:full_name).include?("Thread#join"))
191
+ assert(bg.methods.map(&:full_name).include?("Kernel#sleep"))
192
+ assert_in_delta(0, fg.total_time, 0.01)
193
+ assert_in_delta(0, bg.total_time, 0.01)
194
+ end
195
+
196
+ def test_waiting_for_threads_does_accumulate_wall_time
197
+ RubyProf::measure_mode = RubyProf::WALL_TIME
198
+ background_thread = nil
199
+ result = RubyProf.profile do
200
+ background_thread = Thread.new{ sleep 0.1 }
201
+ background_thread.join
202
+ end
203
+ # check number of threads
204
+ assert_equal(2, result.threads.length)
205
+ fg, bg = result.threads
206
+ assert(fg.methods.map(&:full_name).include?("Thread#join"))
207
+ assert(bg.methods.map(&:full_name).include?("Kernel#sleep"))
208
+ assert_in_delta(0.1, fg.total_time, 0.01)
209
+ assert_in_delta(0.1, fg.wait_time, 0.01)
210
+ assert_in_delta(0.1, bg.total_time, 0.01)
211
+ end
212
+ end
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+
6
+ class MeasureGCRunsTest < TestCase
7
+ include MemoryTestHelper
8
+
9
+ def test_gc_runs_mode
10
+ RubyProf::measure_mode = RubyProf::GC_RUNS
11
+ assert_equal(RubyProf::GC_RUNS, RubyProf::measure_mode)
12
+ end
13
+
14
+ def test_gc_runs_enabled_defined
15
+ assert(defined?(RubyProf::GC_RUNS_ENABLED))
16
+ end
17
+
18
+ if RubyProf::GC_RUNS_ENABLED
19
+ def test_gc_runs
20
+ t = RubyProf.measure_gc_runs
21
+ assert_kind_of Integer, t
22
+
23
+ GC.enable_stats if GC.respond_to?(:enable_stats)
24
+ GC.start
25
+
26
+ u = RubyProf.measure_gc_runs
27
+ assert u > t, [t, u].inspect
28
+ RubyProf::measure_mode = RubyProf::GC_RUNS
29
+ memory_test_helper
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+
6
+ class MeasureGCTimeTest < TestCase
7
+ include MemoryTestHelper
8
+
9
+ def test_gc_time_mode
10
+ RubyProf::measure_mode = RubyProf::GC_TIME
11
+ assert_equal(RubyProf::GC_TIME, RubyProf::measure_mode)
12
+ end
13
+
14
+ def test_gc_time_enabled_defined
15
+ assert(defined?(RubyProf::GC_TIME_ENABLED))
16
+ end
17
+
18
+ if RubyProf::GC_TIME_ENABLED
19
+ def test_gc_time
20
+ RubyProf::measure_mode = RubyProf::GC_TIME
21
+ RubyProf.enable_gc_stats_if_needed
22
+
23
+ t = RubyProf.measure_gc_time
24
+ assert_kind_of Float, t
25
+
26
+ GC.start
27
+
28
+ u = RubyProf.measure_gc_time
29
+ assert u > t, [t, u].inspect
30
+
31
+ memory_test_helper
32
+ ensure
33
+ RubyProf.disable_gc_stats_if_needed
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+
6
+ class MeasureMemoryTest < TestCase
7
+ include MemoryTestHelper
8
+
9
+ def test_memory_mode
10
+ RubyProf::measure_mode = RubyProf::MEMORY
11
+ assert_equal(RubyProf::MEMORY, RubyProf::measure_mode)
12
+ end
13
+
14
+ def test_memory_enabled_defined
15
+ assert(defined?(RubyProf::MEMORY_ENABLED))
16
+ end
17
+
18
+ if RubyProf::MEMORY_ENABLED
19
+ def test_memory
20
+ RubyProf::measure_mode = RubyProf::MEMORY
21
+ RubyProf.enable_gc_stats_if_needed
22
+ t = RubyProf.measure_memory
23
+ assert_kind_of Float, t
24
+ u = RubyProf.measure_memory
25
+ assert_operator u, :>, t
26
+ total = memory_test_helper
27
+ assert(total > 0, 'Should measure more than zero kilobytes of memory usage')
28
+ refute_equal(0, total % 1, 'Should not truncate fractional kilobyte measurements')
29
+ ensure
30
+ RubyProf.disable_gc_stats_if_needed
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+
6
+ class MeasureProcessTimeTest < TestCase
7
+ def setup
8
+ # Need to fix this for linux (windows works since PROCESS_TIME is WALL_TIME anyway)
9
+ RubyProf::measure_mode = RubyProf::PROCESS_TIME
10
+ end
11
+
12
+ def test_mode
13
+ assert_equal(RubyProf::PROCESS_TIME, RubyProf::measure_mode)
14
+ end
15
+
16
+ def test_process_time_enabled_defined
17
+ assert(defined?(RubyProf::PROCESS_TIME_ENABLED))
18
+ end
19
+
20
+ def test_primes
21
+ start = Process.times
22
+ result = RubyProf.profile do
23
+ run_primes(10000)
24
+ end
25
+ finish = Process.times
26
+
27
+ total_time = (finish.utime - start.utime) + (finish.stime - start.stime)
28
+
29
+ thread = result.threads.first
30
+ assert_in_delta(total_time, thread.total_time, 0.03)
31
+
32
+ methods = result.threads.first.methods.sort.reverse
33
+
34
+ expected_number_of_methods =
35
+ case RUBY_VERSION
36
+ when /^2\.(1|2)/ then 14
37
+ else 13
38
+ end
39
+ # puts methods.map(&:full_name).inspect
40
+ assert_equal expected_number_of_methods, methods.length
41
+
42
+ # Check times
43
+ assert_equal("MeasureProcessTimeTest#test_primes", methods[0].full_name)
44
+ assert_in_delta(total_time, methods[0].total_time, 0.02)
45
+ assert_in_delta(0.0, methods[0].wait_time, 0.01)
46
+ assert_in_delta(0.0, methods[0].self_time, 0.01)
47
+
48
+ assert_equal("Object#run_primes", methods[1].full_name)
49
+ assert_in_delta(total_time, methods[1].total_time, 0.02)
50
+ assert_in_delta(0.0, methods[1].wait_time, 0.01)
51
+ assert_in_delta(0.0, methods[1].self_time, 0.01)
52
+
53
+ assert_equal("Object#find_primes", methods[2].full_name)
54
+ assert_equal("Array#select", methods[3].full_name)
55
+ assert_equal("Object#is_prime", methods[4].full_name)
56
+ assert_equal("Integer#upto", methods[5].full_name)
57
+ assert_equal("Object#make_random_array", methods[6].full_name)
58
+ assert_equal("Array#each_index", methods[7].full_name)
59
+ assert_equal("Kernel#rand", methods[8].full_name)
60
+ end
61
+ end
@@ -0,0 +1,255 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+
6
+ class MeasureWallTimeTest < TestCase
7
+ def setup
8
+ # Need to use wall time for this test due to the sleep calls
9
+ RubyProf::measure_mode = RubyProf::WALL_TIME
10
+ end
11
+
12
+ def test_mode
13
+ RubyProf::measure_mode = RubyProf::WALL_TIME
14
+ assert_equal(RubyProf::WALL_TIME, RubyProf::measure_mode)
15
+ end
16
+
17
+ def test_wall_time_enabled_defined
18
+ assert(defined?(RubyProf::WALL_TIME_ENABLED))
19
+ end
20
+
21
+ def test_class_methods
22
+ result = RubyProf.profile do
23
+ RubyProf::C1.hello
24
+ end
25
+
26
+ thread = result.threads.first
27
+ assert_in_delta(0.1, thread.total_time, 0.01)
28
+
29
+ top_methods = thread.top_methods
30
+ assert_equal(1, top_methods.count)
31
+ assert_equal("MeasureWallTimeTest#test_class_methods", top_methods[0].full_name)
32
+
33
+ # Length should be 3:
34
+ # MeasureWallTimeTest#test_class_methods
35
+ # <Class::RubyProf::C1>#hello
36
+ # Kernel#sleep
37
+
38
+ methods = result.threads.first.methods.sort.reverse
39
+ assert_equal(3, methods.length)
40
+
41
+ # Check the names
42
+ assert_equal('MeasureWallTimeTest#test_class_methods', methods[0].full_name)
43
+ assert_equal('<Class::RubyProf::C1>#hello', methods[1].full_name)
44
+ assert_equal('Kernel#sleep', methods[2].full_name)
45
+
46
+ # Check times
47
+ assert_in_delta(0.1, methods[0].total_time, 0.01)
48
+ assert_in_delta(0, methods[0].wait_time, 0.01)
49
+ assert_in_delta(0, methods[0].self_time, 0.01)
50
+
51
+ assert_in_delta(0.1, methods[1].total_time, 0.01)
52
+ assert_in_delta(0, methods[1].wait_time, 0.01)
53
+ assert_in_delta(0, methods[1].self_time, 0.01)
54
+
55
+ assert_in_delta(0.1, methods[2].total_time, 0.01)
56
+ assert_in_delta(0, methods[2].wait_time, 0.01)
57
+ assert_in_delta(0.1, methods[2].self_time, 0.01)
58
+ end
59
+
60
+ def test_instance_methods
61
+ result = RubyProf.profile do
62
+ RubyProf::C1.new.hello
63
+ end
64
+
65
+ thread = result.threads.first
66
+ assert_in_delta(0.2, thread.total_time, 0.01)
67
+
68
+ top_methods = thread.top_methods
69
+ assert_equal(1, top_methods.count)
70
+ assert_equal("MeasureWallTimeTest#test_instance_methods", top_methods[0].full_name)
71
+
72
+ # Methods called
73
+ # MeasureWallTimeTest#test_instance_methods
74
+ # Class.new
75
+ # Class:Object#allocate
76
+ # for Object#initialize
77
+ # C1#hello
78
+ # Kernel#sleep
79
+
80
+ methods = result.threads.first.methods.sort.reverse
81
+ assert_equal(RubyProf.ruby_2? ? 5 : 6, methods.length)
82
+ names = methods.map(&:full_name)
83
+ assert_equal('MeasureWallTimeTest#test_instance_methods', names[0])
84
+ assert_equal('RubyProf::C1#hello', names[1])
85
+ assert_equal('Kernel#sleep', names[2])
86
+ assert_equal('Class#new', names[3])
87
+
88
+ # order can differ
89
+ assert(names.include?("#{RubyProf.parent_object}#initialize"))
90
+ unless RubyProf.ruby_2?
91
+ assert(names.include?("<Class::#{RubyProf.parent_object}>#allocate"))
92
+ end
93
+
94
+ # Check times
95
+ assert_in_delta(0.2, methods[0].total_time, 0.02)
96
+ assert_in_delta(0, methods[0].wait_time, 0.02)
97
+ assert_in_delta(0, methods[0].self_time, 0.02)
98
+
99
+ assert_in_delta(0.2, methods[1].total_time, 0.02)
100
+ assert_in_delta(0, methods[1].wait_time, 0.02)
101
+ assert_in_delta(0, methods[1].self_time, 0.02)
102
+
103
+ assert_in_delta(0.2, methods[2].total_time, 0.02)
104
+ assert_in_delta(0, methods[2].wait_time, 0.02)
105
+ assert_in_delta(0.2, methods[2].self_time, 0.02)
106
+
107
+ assert_in_delta(0, methods[3].total_time, 0.01)
108
+ assert_in_delta(0, methods[3].wait_time, 0.01)
109
+ assert_in_delta(0, methods[3].self_time, 0.01)
110
+
111
+ assert_in_delta(0, methods[4].total_time, 0.01)
112
+ assert_in_delta(0, methods[4].wait_time, 0.01)
113
+ assert_in_delta(0, methods[4].self_time, 0.01)
114
+
115
+ unless RubyProf.ruby_2?
116
+ assert_in_delta(0, methods[5].total_time, 0.01)
117
+ assert_in_delta(0, methods[5].wait_time, 0.01)
118
+ assert_in_delta(0, methods[5].self_time, 0.01)
119
+ end
120
+ end
121
+
122
+ def test_module_methods
123
+ result = RubyProf.profile do
124
+ RubyProf::C2.hello
125
+ end
126
+
127
+ thread = result.threads.first
128
+ assert_in_delta(0.3, thread.total_time, 0.01)
129
+
130
+ top_methods = thread.top_methods
131
+ assert_equal(1, top_methods.count)
132
+ assert_equal("MeasureWallTimeTest#test_module_methods", top_methods[0].full_name)
133
+
134
+ # Methods:
135
+ # MeasureWallTimeTest#test_module_methods
136
+ # M1#hello
137
+ # Kernel#sleep
138
+
139
+ methods = result.threads.first.methods.sort.reverse
140
+ assert_equal(3, methods.length)
141
+
142
+ assert_equal('MeasureWallTimeTest#test_module_methods', methods[0].full_name)
143
+ assert_equal('RubyProf::M1#hello', methods[1].full_name)
144
+ assert_equal('Kernel#sleep', methods[2].full_name)
145
+
146
+ # Check times
147
+ assert_in_delta(0.3, methods[0].total_time, 0.1)
148
+ assert_in_delta(0, methods[0].wait_time, 0.02)
149
+ assert_in_delta(0, methods[0].self_time, 0.02)
150
+
151
+ assert_in_delta(0.3, methods[1].total_time, 0.1)
152
+ assert_in_delta(0, methods[1].wait_time, 0.02)
153
+ assert_in_delta(0, methods[1].self_time, 0.02)
154
+
155
+ assert_in_delta(0.3, methods[2].total_time, 0.1)
156
+ assert_in_delta(0, methods[2].wait_time, 0.02)
157
+ assert_in_delta(0.3, methods[2].self_time, 0.1)
158
+ end
159
+
160
+ def test_module_instance_methods
161
+ result = RubyProf.profile do
162
+ RubyProf::C2.new.hello
163
+ end
164
+
165
+ thread = result.threads.first
166
+ assert_in_delta(0.3, thread.total_time, 0.01)
167
+
168
+ top_methods = thread.top_methods
169
+ assert_equal(1, top_methods.count)
170
+ assert_equal("MeasureWallTimeTest#test_module_instance_methods", top_methods[0].full_name)
171
+
172
+ # Methods:
173
+ # MeasureWallTimeTest#test_module_instance_methods
174
+ # Class#new
175
+ # <Class::Object>#allocate
176
+ # Object#initialize
177
+ # M1#hello
178
+ # Kernel#sleep
179
+
180
+ methods = result.threads.first.methods.sort.reverse
181
+ assert_equal(RubyProf.ruby_2? ? 5 : 6, methods.length)
182
+ names = methods.map(&:full_name)
183
+ assert_equal('MeasureWallTimeTest#test_module_instance_methods', names[0])
184
+ assert_equal('RubyProf::M1#hello', names[1])
185
+ assert_equal('Kernel#sleep', names[2])
186
+ assert_equal('Class#new', names[3])
187
+
188
+ # order can differ
189
+ assert(names.include?("#{RubyProf.parent_object}#initialize"))
190
+ unless RubyProf.ruby_2?
191
+ assert(names.include?("<Class::#{RubyProf.parent_object}>#allocate"))
192
+ end
193
+
194
+ # Check times
195
+ assert_in_delta(0.3, methods[0].total_time, 0.1)
196
+ assert_in_delta(0, methods[0].wait_time, 0.1)
197
+ assert_in_delta(0, methods[0].self_time, 0.1)
198
+
199
+ assert_in_delta(0.3, methods[1].total_time, 0.02)
200
+ assert_in_delta(0, methods[1].wait_time, 0.01)
201
+ assert_in_delta(0, methods[1].self_time, 0.01)
202
+
203
+ assert_in_delta(0.3, methods[2].total_time, 0.02)
204
+ assert_in_delta(0, methods[2].wait_time, 0.01)
205
+ assert_in_delta(0.3, methods[2].self_time, 0.02)
206
+
207
+ assert_in_delta(0, methods[3].total_time, 0.01)
208
+ assert_in_delta(0, methods[3].wait_time, 0.01)
209
+ assert_in_delta(0, methods[3].self_time, 0.01)
210
+
211
+ assert_in_delta(0, methods[4].total_time, 0.01)
212
+ assert_in_delta(0, methods[4].wait_time, 0.01)
213
+ assert_in_delta(0, methods[4].self_time, 0.01)
214
+
215
+ unless RubyProf.ruby_2?
216
+ assert_in_delta(0, methods[5].total_time, 0.01)
217
+ assert_in_delta(0, methods[5].wait_time, 0.01)
218
+ assert_in_delta(0, methods[5].self_time, 0.01)
219
+ end
220
+ end
221
+
222
+ def test_singleton
223
+ c3 = RubyProf::C3.new
224
+
225
+ class << c3
226
+ def hello
227
+ end
228
+ end
229
+
230
+ result = RubyProf.profile do
231
+ c3.hello
232
+ end
233
+
234
+ thread = result.threads.first
235
+ assert_in_delta(0.0, thread.total_time, 0.01)
236
+
237
+ top_methods = thread.top_methods
238
+ assert_equal(1, top_methods.count)
239
+ assert_equal("MeasureWallTimeTest#test_singleton", top_methods[0].full_name)
240
+
241
+ methods = result.threads.first.methods.sort.reverse
242
+ assert_equal(2, methods.length)
243
+
244
+ assert_equal('MeasureWallTimeTest#test_singleton', methods[0].full_name)
245
+ assert_equal('<Object::RubyProf::C3>#hello', methods[1].full_name)
246
+
247
+ assert_in_delta(0, methods[0].total_time, 0.01)
248
+ assert_in_delta(0, methods[0].wait_time, 0.01)
249
+ assert_in_delta(0, methods[0].self_time, 0.01)
250
+
251
+ assert_in_delta(0, methods[1].total_time, 0.01)
252
+ assert_in_delta(0, methods[1].wait_time, 0.01)
253
+ assert_in_delta(0, methods[1].self_time, 0.01)
254
+ end
255
+ end