adamh-ruby-prof 0.7.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. data/CHANGES +202 -0
  2. data/LICENSE +23 -0
  3. data/README +436 -0
  4. data/Rakefile +123 -0
  5. data/bin/ruby-prof +217 -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/extconf.rb +34 -0
  10. data/ext/measure_allocations.h +58 -0
  11. data/ext/measure_cpu_time.h +152 -0
  12. data/ext/measure_gc_runs.h +76 -0
  13. data/ext/measure_gc_time.h +57 -0
  14. data/ext/measure_memory.h +101 -0
  15. data/ext/measure_process_time.h +52 -0
  16. data/ext/measure_wall_time.h +53 -0
  17. data/ext/mingw/Rakefile +23 -0
  18. data/ext/mingw/build.rake +38 -0
  19. data/ext/ruby_prof.c +1747 -0
  20. data/ext/ruby_prof.h +189 -0
  21. data/ext/vc/ruby_prof.sln +20 -0
  22. data/ext/vc/ruby_prof.vcproj +241 -0
  23. data/ext/version.h +4 -0
  24. data/lib/ruby-prof.rb +48 -0
  25. data/lib/ruby-prof/abstract_printer.rb +41 -0
  26. data/lib/ruby-prof/aggregate_call_info.rb +62 -0
  27. data/lib/ruby-prof/call_info.rb +47 -0
  28. data/lib/ruby-prof/call_tree_printer.rb +84 -0
  29. data/lib/ruby-prof/flat_printer.rb +79 -0
  30. data/lib/ruby-prof/graph_html_printer.rb +256 -0
  31. data/lib/ruby-prof/graph_printer.rb +164 -0
  32. data/lib/ruby-prof/method_info.rb +111 -0
  33. data/lib/ruby-prof/task.rb +146 -0
  34. data/lib/ruby-prof/test.rb +148 -0
  35. data/lib/unprof.rb +8 -0
  36. data/rails/environment/profile.rb +24 -0
  37. data/rails/example/example_test.rb +9 -0
  38. data/rails/profile_test_helper.rb +21 -0
  39. data/test/aggregate_test.rb +121 -0
  40. data/test/basic_test.rb +309 -0
  41. data/test/duplicate_names_test.rb +32 -0
  42. data/test/exceptions_test.rb +15 -0
  43. data/test/exclude_threads_test.rb +54 -0
  44. data/test/line_number_test.rb +73 -0
  45. data/test/measurement_test.rb +121 -0
  46. data/test/module_test.rb +54 -0
  47. data/test/no_method_class_test.rb +13 -0
  48. data/test/prime.rb +58 -0
  49. data/test/prime_test.rb +13 -0
  50. data/test/printers_test.rb +71 -0
  51. data/test/recursive_test.rb +254 -0
  52. data/test/singleton_test.rb +37 -0
  53. data/test/stack_test.rb +138 -0
  54. data/test/start_stop_test.rb +95 -0
  55. data/test/test_suite.rb +23 -0
  56. data/test/thread_test.rb +159 -0
  57. data/test/unique_call_path_test.rb +206 -0
  58. metadata +114 -0
@@ -0,0 +1,23 @@
1
+ require 'test/unit'
2
+
3
+ require 'aggregate_test'
4
+ require 'basic_test'
5
+ require 'duplicate_names_test'
6
+ require 'exceptions_test'
7
+ require 'line_number_test'
8
+ require 'measurement_test'
9
+ require 'module_test'
10
+ require 'no_method_class_test'
11
+ require 'prime_test'
12
+ require 'printers_test'
13
+ require 'recursive_test'
14
+ require 'singleton_test'
15
+ require 'stack_test'
16
+ require 'start_stop_test'
17
+ require 'thread_test'
18
+ require 'unique_call_path_test'
19
+
20
+ # Can't use this one here cause it breaks
21
+ # the rest of the unit tets (Ruby Prof gets
22
+ # started twice).
23
+ #require 'profile_unit_test'
@@ -0,0 +1,159 @@
1
+ #!/usr/bin/env ruby
2
+ require 'test/unit'
3
+ require 'ruby-prof'
4
+ require 'timeout'
5
+
6
+ # -- Tests ----
7
+ class ThreadTest < Test::Unit::TestCase
8
+ def setup
9
+ # Need to use wall time for this test due to the sleep calls
10
+ RubyProf::measure_mode = RubyProf::WALL_TIME
11
+ end
12
+
13
+ def test_thread_count
14
+ RubyProf.start
15
+
16
+ thread = Thread.new do
17
+ sleep(1)
18
+ end
19
+
20
+ thread.join
21
+ result = RubyProf.stop
22
+
23
+ assert_equal(2, result.threads.keys.length)
24
+ end
25
+
26
+ def test_thread_identity
27
+ RubyProf.start
28
+
29
+ thread = Thread.new do
30
+ sleep(1)
31
+ end
32
+
33
+ thread.join
34
+ result = RubyProf.stop
35
+
36
+ thread_ids = result.threads.keys.sort
37
+ threads = [Thread.current, thread].sort_by {|thread| thread.object_id}
38
+
39
+ assert_equal(threads[0].object_id, thread_ids[0])
40
+ assert_equal(threads[1].object_id, thread_ids[1])
41
+
42
+ assert_instance_of(Thread, ObjectSpace._id2ref(thread_ids[0]))
43
+ assert_equal(threads[0], ObjectSpace._id2ref(thread_ids[0]))
44
+
45
+ assert_instance_of(Thread, ObjectSpace._id2ref(thread_ids[1]))
46
+ assert_equal(threads[1], ObjectSpace._id2ref(thread_ids[1]))
47
+ end
48
+
49
+ def test_thread_timings
50
+ RubyProf.start
51
+
52
+ thread = Thread.new do
53
+ sleep(1)
54
+ end
55
+
56
+ thread.join
57
+
58
+ result = RubyProf.stop
59
+
60
+ # Check background thread
61
+ methods = result.threads[thread.object_id].sort.reverse
62
+ assert_equal(2, methods.length)
63
+
64
+ method = methods[0]
65
+ assert_equal('ThreadTest#test_thread_timings', method.full_name)
66
+ assert_equal(1, method.called)
67
+ assert_in_delta(1, method.total_time, 0.01)
68
+ assert_in_delta(0, method.self_time, 0.01)
69
+ assert_in_delta(1, method.wait_time, 0.01)
70
+ assert_in_delta(0, method.children_time, 0.01)
71
+ assert_equal(1, method.call_infos.length)
72
+ call_info = method.call_infos[0]
73
+ assert_equal('ThreadTest#test_thread_timings', call_info.call_sequence)
74
+ assert_equal(1, call_info.children.length)
75
+
76
+ method = methods[1]
77
+ assert_equal('Kernel#sleep', method.full_name)
78
+ assert_equal(1, method.called)
79
+ assert_in_delta(1, method.total_time, 0.01)
80
+ assert_in_delta(1.0, method.self_time, 0.01)
81
+ assert_in_delta(0, method.wait_time, 0.01)
82
+ assert_in_delta(0, method.children_time, 0.01)
83
+
84
+ assert_equal(1, method.call_infos.length)
85
+ call_info = method.call_infos[0]
86
+ assert_equal('ThreadTest#test_thread_timings->Kernel#sleep', call_info.call_sequence)
87
+ assert_equal(0, call_info.children.length)
88
+
89
+ # Check foreground thread
90
+ methods = result.threads[Thread.current.object_id].sort.reverse
91
+ assert_equal(4, methods.length)
92
+ methods = methods.sort.reverse
93
+
94
+ method = methods[0]
95
+ assert_equal('ThreadTest#test_thread_timings', method.full_name)
96
+ assert_equal(0, method.called)
97
+ assert_in_delta(1, method.total_time, 0.01)
98
+ assert_in_delta(0, method.self_time, 0.01)
99
+ assert_in_delta(1.0, method.wait_time, 0.01)
100
+ assert_in_delta(0, method.children_time, 0.01)
101
+
102
+ assert_equal(1, method.call_infos.length)
103
+ call_info = method.call_infos[0]
104
+ assert_equal('ThreadTest#test_thread_timings', call_info.call_sequence)
105
+ assert_equal(2, call_info.children.length)
106
+
107
+ method = methods[1]
108
+ assert_equal('Thread#join', method.full_name)
109
+ assert_equal(1, method.called)
110
+ assert_in_delta(1, method.total_time, 0.01)
111
+ assert_in_delta(0, method.self_time, 0.01)
112
+ assert_in_delta(1.0, method.wait_time, 0.01)
113
+ assert_in_delta(0, method.children_time, 0.01)
114
+
115
+ assert_equal(1, method.call_infos.length)
116
+ call_info = method.call_infos[0]
117
+ assert_equal('ThreadTest#test_thread_timings->Thread#join', call_info.call_sequence)
118
+ assert_equal(0, call_info.children.length)
119
+
120
+ method = methods[2]
121
+ assert_equal('<Class::Thread>#new', method.full_name)
122
+ assert_equal(1, method.called)
123
+ assert_in_delta(0, method.total_time, 0.01)
124
+ assert_in_delta(0, method.self_time, 0.01)
125
+ assert_in_delta(0, method.wait_time, 0.01)
126
+ assert_in_delta(0, method.children_time, 0.01)
127
+
128
+ assert_equal(1, method.call_infos.length)
129
+ call_info = method.call_infos[0]
130
+ assert_equal('ThreadTest#test_thread_timings-><Class::Thread>#new', call_info.call_sequence)
131
+ assert_equal(1, call_info.children.length)
132
+
133
+ method = methods[3]
134
+ assert_equal('Thread#initialize', method.full_name)
135
+ assert_equal(1, method.called)
136
+ assert_in_delta(0, method.total_time, 0.01)
137
+ assert_in_delta(0, method.self_time, 0.01)
138
+ assert_in_delta(0, method.wait_time, 0.01)
139
+ assert_in_delta(0, method.children_time, 0.01)
140
+
141
+ assert_equal(1, method.call_infos.length)
142
+ call_info = method.call_infos[0]
143
+ assert_equal('ThreadTest#test_thread_timings-><Class::Thread>#new->Thread#initialize', call_info.call_sequence)
144
+ assert_equal(0, call_info.children.length)
145
+ end
146
+
147
+ def test_thread
148
+ result = RubyProf.profile do
149
+ begin
150
+ status = Timeout::timeout(2) do
151
+ while true
152
+ next
153
+ end
154
+ end
155
+ rescue Timeout::Error
156
+ end
157
+ end
158
+ end
159
+ end
@@ -0,0 +1,206 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'test/unit'
4
+ require 'ruby-prof'
5
+
6
+ class UniqueCallPath
7
+ def method_a(i)
8
+ if i==1
9
+ method_b
10
+ else
11
+ method_c
12
+ end
13
+ end
14
+
15
+ def method_b
16
+ method_c
17
+ end
18
+
19
+ def method_c
20
+ c = 3
21
+ end
22
+
23
+ def method_k(i)
24
+ method_a(i)
25
+ end
26
+ end
27
+
28
+
29
+ # -- Tests ----
30
+ class UniqueCallPathTest < Test::Unit::TestCase
31
+ def test_root_method
32
+ unique_call_path = UniqueCallPath.new
33
+
34
+ result = RubyProf.profile do
35
+ unique_call_path.method_a(1)
36
+ end
37
+
38
+ root_methods = Array.new
39
+ result.threads.each do | thread_id, methods |
40
+ methods.each do | m |
41
+ if m.root?
42
+ root_methods.push(m)
43
+ end
44
+ end
45
+ end
46
+
47
+ assert_equal(1, root_methods.length)
48
+ assert_equal("UniqueCallPathTest#test_root_method", root_methods[0].full_name)
49
+ end
50
+
51
+ def test_root_children
52
+ unique_call_path = UniqueCallPath.new
53
+
54
+ result = RubyProf.profile do
55
+ unique_call_path.method_a(1)
56
+ unique_call_path.method_k(2)
57
+ end
58
+
59
+ root_methods = Array.new
60
+ result.threads.each do | thread_id, methods |
61
+ methods.each do | m |
62
+ if m.root?
63
+ root_methods.push(m)
64
+ end
65
+ end
66
+ end
67
+
68
+ assert_equal(1, root_methods.length)
69
+
70
+ root_children = Array.new
71
+ root_methods[0].children.each do | c |
72
+ if c.parent.target.eql?(root_methods[0])
73
+ root_children.push(c)
74
+ end
75
+ end
76
+
77
+ children = root_children.sort do |c1, c2|
78
+ c1.target.full_name <=> c2.target.full_name
79
+ end
80
+
81
+ assert_equal(2, children.length)
82
+ assert_equal("UniqueCallPath#method_a", children[0].target.full_name)
83
+ assert_equal("UniqueCallPath#method_k", children[1].target.full_name)
84
+ end
85
+
86
+ def test_children_of
87
+ unique_call_path = UniqueCallPath.new
88
+
89
+ result = RubyProf.profile do
90
+ unique_call_path.method_a(1)
91
+ unique_call_path.method_k(2)
92
+ end
93
+
94
+ root_methods = Array.new
95
+ result.threads.each do | thread_id, methods |
96
+ methods.each do | m |
97
+ if m.root?
98
+ root_methods.push(m)
99
+ end
100
+ end
101
+ end
102
+
103
+ assert_equal(1, root_methods.length)
104
+ method = root_methods[0]
105
+ assert_equal('UniqueCallPathTest#test_children_of', method.full_name)
106
+
107
+ call_info_a = nil
108
+ root_methods[0].children.each do | c |
109
+ if c.target.full_name == "UniqueCallPath#method_a"
110
+ call_info_a = c
111
+ break
112
+ end
113
+ end
114
+
115
+ assert !call_info_a.nil?
116
+
117
+ children_of_a = Array.new
118
+
119
+ call_info_a.children.each do | c |
120
+ if c.parent.eql?(call_info_a)
121
+ children_of_a.push(c)
122
+ end
123
+ end
124
+
125
+ assert_equal(4, call_info_a.target.children.length)
126
+
127
+ children_of_a = children_of_a.sort do |c1, c2|
128
+ c1.target.full_name <=> c2.target.full_name
129
+ end
130
+
131
+ assert_equal(2, children_of_a.length)
132
+ assert_equal("Fixnum#==", children_of_a[0].target.full_name)
133
+ assert_equal("UniqueCallPath#method_b", children_of_a[1].target.full_name)
134
+ end
135
+
136
+ def test_id2ref
137
+ unique_call_path = UniqueCallPath.new
138
+
139
+ result = RubyProf.profile do
140
+ unique_call_path.method_a(1)
141
+ end
142
+
143
+ root_methods = Array.new
144
+ result.threads.each do | thread_id, methods |
145
+ methods.each do | m |
146
+ if m.root?
147
+ root_methods.push(m)
148
+ end
149
+ end
150
+ end
151
+
152
+ child = root_methods[0].children[0]
153
+
154
+ assert_not_equal(0, child.id)
155
+ #assert_equal(RubyProf::CallInfo.id2ref(child.id).target.full_name, child.target.full_name)
156
+ end
157
+
158
+ def test_unique_path
159
+ unique_call_path = UniqueCallPath.new
160
+
161
+ result = RubyProf.profile do
162
+ unique_call_path.method_a(1)
163
+ unique_call_path.method_k(1)
164
+ end
165
+
166
+ root_methods = Array.new
167
+ result.threads.each do | thread_id, methods |
168
+ methods.each do | m |
169
+ if m.root?
170
+ root_methods.push(m)
171
+ end
172
+ end
173
+ end
174
+
175
+ assert_equal(1, root_methods.length)
176
+
177
+ call_info_a = nil
178
+ root_methods[0].children.each do | c |
179
+ if c.target.full_name == "UniqueCallPath#method_a"
180
+ call_info_a = c
181
+ break
182
+ end
183
+ end
184
+
185
+ assert !call_info_a.nil?
186
+
187
+ children_of_a = Array.new
188
+ call_info_a.children.each do |c|
189
+ if c.parent.eql?(call_info_a)
190
+ children_of_a.push(c)
191
+ end
192
+ end
193
+
194
+ assert_equal(4, call_info_a.target.children.length)
195
+
196
+ children_of_a = children_of_a.sort do |c1, c2|
197
+ c1.target.full_name <=> c2.target.full_name
198
+ end
199
+
200
+ assert_equal(2, children_of_a.length)
201
+ assert_equal(1, children_of_a[0].called)
202
+ assert_equal("Fixnum#==", children_of_a[0].target.full_name)
203
+ assert_equal(1, children_of_a[1].called)
204
+ assert_equal("UniqueCallPath#method_b", children_of_a[1].target.full_name)
205
+ end
206
+ end
metadata ADDED
@@ -0,0 +1,114 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: adamh-ruby-prof
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.7.3
5
+ platform: ruby
6
+ authors:
7
+ - Shugo Maeda and Charlie Savage
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-06-08 00:00:00 -07:00
13
+ default_executable: ruby-prof
14
+ dependencies: []
15
+
16
+ description: ruby-prof is a fast code profiler for Ruby. It is a C extension and therefore is many times faster than the standard Ruby profiler. It supports both flat and graph profiles. For each method, graph profiles show how long the method ran, which methods called it and which methods it called. RubyProf generate both text and html and can output it to standard out or to a file.
17
+ email: shugo@ruby-lang.org and cfis@savagexi.com
18
+ executables:
19
+ - ruby-prof
20
+ extensions:
21
+ - ext/extconf.rb
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - Rakefile
26
+ - README
27
+ - LICENSE
28
+ - CHANGES
29
+ - bin/ruby-prof
30
+ - examples/graph.html
31
+ - examples/graph.txt
32
+ - examples/flat.txt
33
+ - ext/version.h
34
+ - ext/measure_memory.h
35
+ - ext/extconf.rb
36
+ - ext/mingw
37
+ - ext/measure_gc_time.h
38
+ - ext/ruby_prof.h
39
+ - ext/measure_allocations.h
40
+ - ext/ruby_prof.c
41
+ - ext/vc
42
+ - ext/measure_wall_time.h
43
+ - ext/measure_cpu_time.h
44
+ - ext/measure_gc_runs.h
45
+ - ext/measure_process_time.h
46
+ - ext/mingw/Rakefile
47
+ - ext/mingw/build.rake
48
+ - ext/vc/ruby_prof.sln
49
+ - ext/vc/ruby_prof.vcproj
50
+ - lib/ruby-prof.rb
51
+ - lib/unprof.rb
52
+ - lib/ruby-prof
53
+ - lib/ruby-prof/call_tree_printer.rb
54
+ - lib/ruby-prof/method_info.rb
55
+ - lib/ruby-prof/graph_printer.rb
56
+ - lib/ruby-prof/abstract_printer.rb
57
+ - lib/ruby-prof/task.rb
58
+ - lib/ruby-prof/flat_printer.rb
59
+ - lib/ruby-prof/aggregate_call_info.rb
60
+ - lib/ruby-prof/call_info.rb
61
+ - lib/ruby-prof/graph_html_printer.rb
62
+ - lib/ruby-prof/test.rb
63
+ - rails/example
64
+ - rails/example/example_test.rb
65
+ - rails/environment
66
+ - rails/environment/profile.rb
67
+ - rails/profile_test_helper.rb
68
+ - test/start_stop_test.rb
69
+ - test/printers_test.rb
70
+ - test/measurement_test.rb
71
+ - test/stack_test.rb
72
+ - test/basic_test.rb
73
+ - test/prime_test.rb
74
+ - test/thread_test.rb
75
+ - test/line_number_test.rb
76
+ - test/singleton_test.rb
77
+ - test/unique_call_path_test.rb
78
+ - test/no_method_class_test.rb
79
+ - test/duplicate_names_test.rb
80
+ - test/recursive_test.rb
81
+ - test/test_suite.rb
82
+ - test/aggregate_test.rb
83
+ - test/module_test.rb
84
+ - test/exceptions_test.rb
85
+ - test/prime.rb
86
+ - test/exclude_threads_test.rb
87
+ has_rdoc: true
88
+ homepage: http://rubyforge.org/projects/ruby-prof/
89
+ post_install_message:
90
+ rdoc_options: []
91
+
92
+ require_paths:
93
+ - lib
94
+ required_ruby_version: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: 1.8.4
99
+ version:
100
+ required_rubygems_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: "0"
105
+ version:
106
+ requirements: []
107
+
108
+ rubyforge_project: ruby-prof
109
+ rubygems_version: 1.2.0
110
+ signing_key:
111
+ specification_version: 2
112
+ summary: Fast Ruby profiler
113
+ test_files:
114
+ - test/test_suite.rb