ruby-prof 0.8.1-x86-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. data/CHANGES +221 -0
  2. data/LICENSE +23 -0
  3. data/README +432 -0
  4. data/Rakefile +159 -0
  5. data/bin/ruby-prof +224 -0
  6. data/examples/flat.txt +55 -0
  7. data/examples/graph.html +823 -0
  8. data/examples/graph.txt +170 -0
  9. data/ext/ruby_prof/measure_allocations.h +58 -0
  10. data/ext/ruby_prof/measure_cpu_time.h +152 -0
  11. data/ext/ruby_prof/measure_gc_runs.h +76 -0
  12. data/ext/ruby_prof/measure_gc_time.h +57 -0
  13. data/ext/ruby_prof/measure_memory.h +101 -0
  14. data/ext/ruby_prof/measure_process_time.h +52 -0
  15. data/ext/ruby_prof/measure_wall_time.h +53 -0
  16. data/ext/ruby_prof/mingw/Rakefile +23 -0
  17. data/ext/ruby_prof/mingw/build.rake +38 -0
  18. data/ext/ruby_prof/ruby_prof.c +1747 -0
  19. data/ext/ruby_prof/ruby_prof.h +188 -0
  20. data/ext/ruby_prof/version.h +4 -0
  21. data/lib/1.8/ruby_prof.so +0 -0
  22. data/lib/1.9/ruby_prof.so +0 -0
  23. data/lib/ruby-prof.rb +56 -0
  24. data/lib/ruby-prof/abstract_printer.rb +41 -0
  25. data/lib/ruby-prof/aggregate_call_info.rb +62 -0
  26. data/lib/ruby-prof/call_info.rb +47 -0
  27. data/lib/ruby-prof/call_tree_printer.rb +84 -0
  28. data/lib/ruby-prof/flat_printer.rb +78 -0
  29. data/lib/ruby-prof/flat_printer_with_line_numbers.rb +72 -0
  30. data/lib/ruby-prof/graph_html_printer.rb +256 -0
  31. data/lib/ruby-prof/graph_printer.rb +157 -0
  32. data/lib/ruby-prof/method_info.rb +111 -0
  33. data/lib/ruby-prof/symbol_to_proc.rb +8 -0
  34. data/lib/ruby-prof/task.rb +146 -0
  35. data/lib/ruby-prof/test.rb +148 -0
  36. data/lib/unprof.rb +8 -0
  37. data/rails/environment/profile.rb +24 -0
  38. data/rails/example/example_test.rb +9 -0
  39. data/rails/profile_test_helper.rb +21 -0
  40. data/test/aggregate_test.rb +121 -0
  41. data/test/basic_test.rb +290 -0
  42. data/test/current_failures_windows +8 -0
  43. data/test/do_nothing.rb +0 -0
  44. data/test/duplicate_names_test.rb +32 -0
  45. data/test/enumerable_test.rb +16 -0
  46. data/test/exceptions_test.rb +15 -0
  47. data/test/exclude_threads_test.rb +54 -0
  48. data/test/exec_test.rb +14 -0
  49. data/test/line_number_test.rb +73 -0
  50. data/test/measurement_test.rb +121 -0
  51. data/test/module_test.rb +54 -0
  52. data/test/no_method_class_test.rb +13 -0
  53. data/test/prime.rb +58 -0
  54. data/test/prime_test.rb +13 -0
  55. data/test/printers_test.rb +130 -0
  56. data/test/recursive_test.rb +275 -0
  57. data/test/ruby-prof-bin +20 -0
  58. data/test/singleton_test.rb +37 -0
  59. data/test/stack_test.rb +138 -0
  60. data/test/start_stop_test.rb +95 -0
  61. data/test/test_suite.rb +23 -0
  62. data/test/thread_test.rb +173 -0
  63. data/test/unique_call_path_test.rb +225 -0
  64. metadata +143 -0
@@ -0,0 +1,9 @@
1
+ require File.dirname(__FILE__) + '../profile_test_helper'
2
+
3
+ class ExampleTest < Test::Unit::TestCase
4
+ include RubyProf::Test
5
+
6
+ def test_stuff
7
+ puts "Test method"
8
+ end
9
+ end
@@ -0,0 +1,21 @@
1
+ # Load profile environment
2
+ env = ENV["RAILS_ENV"] = "profile"
3
+ require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
4
+
5
+ # Load Rails testing infrastructure
6
+ require 'test_help'
7
+
8
+ # Now we can load test_helper since we've already loaded the
9
+ # profile RAILS environment.
10
+ require File.expand_path(File.join(RAILS_ROOT, 'test', 'test_helper'))
11
+
12
+ # Reset the current environment back to profile
13
+ # since test_helper reset it to test
14
+ ENV["RAILS_ENV"] = env
15
+
16
+ # Now load ruby-prof and away we go
17
+ require 'ruby-prof'
18
+
19
+ # Setup output directory to Rails tmp directory
20
+ RubyProf::Test::PROFILE_OPTIONS[:output_dir] =
21
+ File.expand_path(File.join(RAILS_ROOT, 'tmp', 'profile'))
@@ -0,0 +1,121 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'test/unit'
4
+ require 'ruby-prof'
5
+
6
+ # Test data
7
+ # A B C
8
+ # | | |
9
+ # Z A A
10
+ # | |
11
+ # Z Z
12
+
13
+ class AggClass
14
+ def z
15
+ sleep 1
16
+ end
17
+
18
+ def a
19
+ z
20
+ end
21
+
22
+ def b
23
+ a
24
+ end
25
+
26
+ def c
27
+ a
28
+ end
29
+ end
30
+
31
+ class AggregateTest < Test::Unit::TestCase
32
+ def setup
33
+ # Need to use wall time for this test due to the sleep calls
34
+ RubyProf::measure_mode = RubyProf::WALL_TIME
35
+ end
36
+
37
+ def test_call_infos
38
+ c1 = AggClass.new
39
+ result = RubyProf.profile do
40
+ c1.a
41
+ c1.b
42
+ c1.c
43
+ end
44
+
45
+ methods = result.threads.values.first.sort.reverse
46
+ method = methods.find {|method| method.full_name == 'AggClass#z'}
47
+
48
+ # Check AggClass#z
49
+ assert_equal('AggClass#z', method.full_name)
50
+ assert_equal(3, method.called)
51
+ assert_in_delta(3, method.total_time, 0.01)
52
+ assert_in_delta(0, method.wait_time, 0.01)
53
+ assert_in_delta(0, method.self_time, 0.01)
54
+ assert_in_delta(3, method.children_time, 0.01)
55
+ assert_equal(3, method.call_infos.length)
56
+
57
+ call_info = method.call_infos[0]
58
+ assert_equal('AggregateTest#test_call_infos->AggClass#a->AggClass#z', call_info.call_sequence)
59
+ assert_equal(1, call_info.children.length)
60
+
61
+ call_info = method.call_infos[1]
62
+ assert_equal('AggregateTest#test_call_infos->AggClass#b->AggClass#a->AggClass#z', call_info.call_sequence)
63
+ assert_equal(1, call_info.children.length)
64
+
65
+ call_info = method.call_infos[2]
66
+ assert_equal('AggregateTest#test_call_infos->AggClass#c->AggClass#a->AggClass#z', call_info.call_sequence)
67
+ assert_equal(1, call_info.children.length)
68
+ end
69
+
70
+ def test_aggregates_parents
71
+ c1 = AggClass.new
72
+ result = RubyProf.profile do
73
+ c1.a
74
+ c1.b
75
+ c1.c
76
+ end
77
+
78
+ methods = result.threads.values.first.sort.reverse
79
+ method = methods.find {|method| method.full_name == 'AggClass#z'}
80
+
81
+ # Check AggClass#z
82
+ assert_equal('AggClass#z', method.full_name)
83
+
84
+ call_infos = method.aggregate_parents
85
+ assert_equal(1, call_infos.length)
86
+
87
+ call_info = call_infos.first
88
+ assert_equal('AggClass#a', call_info.parent.target.full_name)
89
+ assert_in_delta(3, call_info.total_time, 0.05)
90
+ assert_in_delta(0, call_info.wait_time, 0.01)
91
+ assert_in_delta(0, call_info.self_time, 0.05)
92
+ assert_in_delta(3, call_info.children_time, 0.05)
93
+ assert_equal(3, call_info.called)
94
+ end
95
+
96
+ def test_aggregates_children
97
+ c1 = AggClass.new
98
+ result = RubyProf.profile do
99
+ c1.a
100
+ c1.b
101
+ c1.c
102
+ end
103
+
104
+ methods = result.threads.values.first.sort.reverse
105
+ method = methods.find {|method| method.full_name == 'AggClass#a'}
106
+
107
+ # Check AggClass#a
108
+ assert_equal('AggClass#a', method.full_name)
109
+
110
+ call_infos = method.aggregate_children
111
+ assert_equal(1, call_infos.length)
112
+
113
+ call_info = call_infos.first
114
+ assert_equal('AggClass#z', call_info.target.full_name)
115
+ assert_in_delta(3, call_info.total_time, 0.05)
116
+ assert_in_delta(0, call_info.wait_time, 0.01)
117
+ assert_in_delta(0, call_info.self_time, 0.05)
118
+ assert_in_delta(3, call_info.children_time, 0.05)
119
+ assert_equal(3, call_info.called)
120
+ end
121
+ end
@@ -0,0 +1,290 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'test/unit'
4
+ require 'ruby-prof'
5
+
6
+ class C1
7
+ def C1.hello
8
+ sleep(0.1)
9
+ end
10
+
11
+ def hello
12
+ sleep(0.2)
13
+ end
14
+ end
15
+
16
+ module M1
17
+ def hello
18
+ sleep(0.3)
19
+ end
20
+ end
21
+
22
+ class C2
23
+ include M1
24
+ extend M1
25
+ end
26
+
27
+ class C3
28
+ def hello
29
+ sleep(0.4)
30
+ end
31
+ end
32
+
33
+ module M4
34
+ def hello
35
+ sleep(0.5)
36
+ end
37
+ end
38
+
39
+ module M5
40
+ include M4
41
+ def goodbye
42
+ hello
43
+ end
44
+ end
45
+
46
+ class C6
47
+ include M5
48
+ def test
49
+ goodbye
50
+ end
51
+ end
52
+
53
+ class BasicTest < Test::Unit::TestCase
54
+ def setup
55
+ # Need to use wall time for this test due to the sleep calls
56
+ RubyProf::measure_mode = RubyProf::WALL_TIME
57
+ end
58
+
59
+ def test_running
60
+ assert(!RubyProf.running?)
61
+ RubyProf.start
62
+ assert(RubyProf.running?)
63
+ RubyProf.stop
64
+ assert(!RubyProf.running?)
65
+ end
66
+
67
+ def test_double_profile
68
+ RubyProf.start
69
+ assert_raise(RuntimeError) do
70
+ RubyProf.start
71
+ end
72
+
73
+ assert_raise(RuntimeError) do
74
+ RubyProf.profile do
75
+ puts 1
76
+ end
77
+ end
78
+ RubyProf.stop
79
+ end
80
+
81
+ def test_no_block
82
+ assert_raise(ArgumentError) do
83
+ RubyProf.profile
84
+ end
85
+ end
86
+
87
+ def test_class_methods
88
+ result = RubyProf.profile do
89
+ C1.hello
90
+ end
91
+
92
+ # Length should be 3:
93
+ # BasicTest#test_class_methods
94
+ # <Class::C1>#hello
95
+ # Kernel#sleep
96
+
97
+ methods = result.threads.values.first.sort.reverse
98
+ assert_equal(3, methods.length)
99
+
100
+ # Check the names
101
+ assert_equal('BasicTest#test_class_methods', methods[0].full_name)
102
+ assert_equal('<Class::C1>#hello', methods[1].full_name)
103
+ assert_equal('Kernel#sleep', methods[2].full_name)
104
+
105
+ # Check times
106
+ assert_in_delta(0.1, methods[0].total_time, 0.01)
107
+ assert_in_delta(0, methods[0].wait_time, 0.01)
108
+ assert_in_delta(0, methods[0].self_time, 0.01)
109
+
110
+ assert_in_delta(0.1, methods[1].total_time, 0.01)
111
+ assert_in_delta(0, methods[1].wait_time, 0.01)
112
+ assert_in_delta(0, methods[1].self_time, 0.01)
113
+
114
+ assert_in_delta(0.1, methods[2].total_time, 0.01)
115
+ assert_in_delta(0, methods[2].wait_time, 0.01)
116
+ assert_in_delta(0.1, methods[2].self_time, 0.01)
117
+ end
118
+
119
+ if RUBY_VERSION < '1.9'
120
+ PARENT = Object
121
+ else
122
+ PARENT = BasicObject
123
+ end
124
+
125
+ def test_instance_methods
126
+ result = RubyProf.profile do
127
+ C1.new.hello
128
+ end
129
+
130
+ # Methods called
131
+ # BasicTest#test_instance_methods
132
+ # Class.new
133
+ # Class:Object#allocate
134
+ # for Object#initialize
135
+ # C1#hello
136
+ # Kernel#sleep
137
+
138
+ methods = result.threads.values.first.sort.reverse
139
+ assert_equal(6, methods.length)
140
+ names = methods.map(&:full_name)
141
+ assert_equal('BasicTest#test_instance_methods', names[0])
142
+ assert_equal('C1#hello', names[1])
143
+ assert_equal('Kernel#sleep', names[2])
144
+ assert_equal('Class#new', names[3])
145
+ # order can differ
146
+ assert(names.include?("<Class::#{PARENT}>#allocate"))
147
+ assert(names.include?("#{PARENT}#initialize"))
148
+
149
+ # Check times
150
+ assert_in_delta(0.2, methods[0].total_time, 0.02)
151
+ assert_in_delta(0, methods[0].wait_time, 0.02)
152
+ assert_in_delta(0, methods[0].self_time, 0.02)
153
+
154
+ assert_in_delta(0.2, methods[1].total_time, 0.02)
155
+ assert_in_delta(0, methods[1].wait_time, 0.02)
156
+ assert_in_delta(0, methods[1].self_time, 0.02)
157
+
158
+ assert_in_delta(0.2, methods[2].total_time, 0.02)
159
+ assert_in_delta(0, methods[2].wait_time, 0.02)
160
+ assert_in_delta(0.2, methods[2].self_time, 0.02)
161
+
162
+ assert_in_delta(0, methods[3].total_time, 0.01)
163
+ assert_in_delta(0, methods[3].wait_time, 0.01)
164
+ assert_in_delta(0, methods[3].self_time, 0.01)
165
+
166
+ assert_in_delta(0, methods[4].total_time, 0.01)
167
+ assert_in_delta(0, methods[4].wait_time, 0.01)
168
+ assert_in_delta(0, methods[4].self_time, 0.01)
169
+
170
+ assert_in_delta(0, methods[5].total_time, 0.01)
171
+ assert_in_delta(0, methods[5].wait_time, 0.01)
172
+ assert_in_delta(0, methods[5].self_time, 0.01)
173
+ end
174
+
175
+ def test_module_methods
176
+ result = RubyProf.profile do
177
+ C2.hello
178
+ end
179
+
180
+ # Methods:
181
+ # BasicTest#test_module_methods
182
+ # M1#hello
183
+ # Kernel#sleep
184
+
185
+ methods = result.threads.values.first.sort.reverse
186
+ assert_equal(3, methods.length)
187
+
188
+ assert_equal('BasicTest#test_module_methods', methods[0].full_name)
189
+ assert_equal('M1#hello', methods[1].full_name)
190
+ assert_equal('Kernel#sleep', methods[2].full_name)
191
+
192
+ # Check times
193
+ assert_in_delta(0.3, methods[0].total_time, 0.1)
194
+ assert_in_delta(0, methods[0].wait_time, 0.02)
195
+ assert_in_delta(0, methods[0].self_time, 0.02)
196
+
197
+ assert_in_delta(0.3, methods[1].total_time, 0.1)
198
+ assert_in_delta(0, methods[1].wait_time, 0.02)
199
+ assert_in_delta(0, methods[1].self_time, 0.02)
200
+
201
+ assert_in_delta(0.3, methods[2].total_time, 0.1)
202
+ assert_in_delta(0, methods[2].wait_time, 0.02)
203
+ assert_in_delta(0.3, methods[2].self_time, 0.1)
204
+ end
205
+
206
+ def test_module_instance_methods
207
+ result = RubyProf.profile do
208
+ C2.new.hello
209
+ end
210
+
211
+ # Methods:
212
+ # BasicTest#test_module_instance_methods
213
+ # Class#new
214
+ # <Class::Object>#allocate
215
+ # Object#initialize
216
+ # M1#hello
217
+ # Kernel#sleep
218
+
219
+ methods = result.threads.values.first.sort.reverse
220
+ assert_equal(6, methods.length)
221
+ names = methods.map(&:full_name)
222
+ assert_equal('BasicTest#test_module_instance_methods', names[0])
223
+ assert_equal('M1#hello', names[1])
224
+ assert_equal('Kernel#sleep', names[2])
225
+ assert_equal('Class#new', names[3])
226
+ assert(names.include?("<Class::#{PARENT}>#allocate"))
227
+ assert(names.include?("#{PARENT}#initialize"))
228
+
229
+ # Check times
230
+ assert_in_delta(0.3, methods[0].total_time, 0.1)
231
+ assert_in_delta(0, methods[0].wait_time, 0.1)
232
+ assert_in_delta(0, methods[0].self_time, 0.1)
233
+
234
+ assert_in_delta(0.3, methods[1].total_time, 0.02)
235
+ assert_in_delta(0, methods[1].wait_time, 0.01)
236
+ assert_in_delta(0, methods[1].self_time, 0.01)
237
+
238
+ assert_in_delta(0.3, methods[2].total_time, 0.02)
239
+ assert_in_delta(0, methods[2].wait_time, 0.01)
240
+ assert_in_delta(0.3, methods[2].self_time, 0.02)
241
+
242
+ assert_in_delta(0, methods[3].total_time, 0.01)
243
+ assert_in_delta(0, methods[3].wait_time, 0.01)
244
+ assert_in_delta(0, methods[3].self_time, 0.01)
245
+
246
+ assert_in_delta(0, methods[4].total_time, 0.01)
247
+ assert_in_delta(0, methods[4].wait_time, 0.01)
248
+ assert_in_delta(0, methods[4].self_time, 0.01)
249
+
250
+ assert_in_delta(0, methods[5].total_time, 0.01)
251
+ assert_in_delta(0, methods[5].wait_time, 0.01)
252
+ assert_in_delta(0, methods[5].self_time, 0.01)
253
+ end
254
+
255
+ def test_singleton
256
+ c3 = C3.new
257
+
258
+ class << c3
259
+ def hello
260
+ end
261
+ end
262
+
263
+ result = RubyProf.profile do
264
+ c3.hello
265
+ end
266
+
267
+ methods = result.threads.values.first.sort.reverse
268
+ assert_equal(2, methods.length)
269
+
270
+ assert_equal('BasicTest#test_singleton', methods[0].full_name)
271
+ assert_equal('<Object::C3>#hello', methods[1].full_name)
272
+
273
+ assert_in_delta(0, methods[0].total_time, 0.01)
274
+ assert_in_delta(0, methods[0].wait_time, 0.01)
275
+ assert_in_delta(0, methods[0].self_time, 0.01)
276
+
277
+ assert_in_delta(0, methods[1].total_time, 0.01)
278
+ assert_in_delta(0, methods[1].wait_time, 0.01)
279
+ assert_in_delta(0, methods[1].self_time, 0.01)
280
+ end
281
+
282
+ def test_traceback
283
+ RubyProf.start
284
+ assert_raise(NoMethodError) do
285
+ RubyProf.xxx
286
+ end
287
+
288
+ RubyProf.stop
289
+ end
290
+ end
@@ -0,0 +1,8 @@
1
+ 1.8 passes, 1.9 however...
2
+
3
+ 1) Failure:
4
+ test_flat_string_with_numbers(PrintersTest) [E:/dev/ruby/ruby-prof/test/printers_test.rb:68]:
5
+ <2> expected but was
6
+ <29>.
7
+
8
+ which is expected until core backports a recent fix.