rdp-ruby-prof 0.7.4

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 +202 -0
  2. data/LICENSE +23 -0
  3. data/README +445 -0
  4. data/Rakefile +123 -0
  5. data/bin/ruby-prof +207 -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.c# +1679 -0
  10. data/ext/Makefile +180 -0
  11. data/ext/extconf.rb +40 -0
  12. data/ext/measure_allocations.h +58 -0
  13. data/ext/measure_cpu_time.h +152 -0
  14. data/ext/measure_gc_runs.h +76 -0
  15. data/ext/measure_gc_time.h +57 -0
  16. data/ext/measure_memory.h +101 -0
  17. data/ext/measure_process_time.h +52 -0
  18. data/ext/measure_wall_time.h +53 -0
  19. data/ext/mingw/Rakefile +23 -0
  20. data/ext/mingw/build.rake +38 -0
  21. data/ext/ruby_prof.c +1707 -0
  22. data/ext/ruby_prof.e +19984 -0
  23. data/ext/ruby_prof.h +188 -0
  24. data/ext/vc/ruby_prof.sln +20 -0
  25. data/ext/vc/ruby_prof.vcproj +241 -0
  26. data/ext/version.h +4 -0
  27. data/lib/ruby-prof.rb +48 -0
  28. data/lib/ruby-prof/abstract_printer.rb +41 -0
  29. data/lib/ruby-prof/aggregate_call_info.rb +62 -0
  30. data/lib/ruby-prof/call_info.rb +47 -0
  31. data/lib/ruby-prof/call_tree_printer.rb +84 -0
  32. data/lib/ruby-prof/flat_printer.rb +79 -0
  33. data/lib/ruby-prof/graph_html_printer.rb +256 -0
  34. data/lib/ruby-prof/graph_html_printer.rb.orig +256 -0
  35. data/lib/ruby-prof/graph_html_printer.rb.rej +34 -0
  36. data/lib/ruby-prof/graph_printer.rb +164 -0
  37. data/lib/ruby-prof/graph_printer.rb.orig +164 -0
  38. data/lib/ruby-prof/method_info.rb +111 -0
  39. data/lib/ruby-prof/task.rb +146 -0
  40. data/lib/ruby-prof/test.rb +148 -0
  41. data/lib/unprof.rb +8 -0
  42. data/rails/environment/profile.rb +24 -0
  43. data/rails/example/example_test.rb +9 -0
  44. data/rails/profile_test_helper.rb +21 -0
  45. data/test/aggregate_test.rb +121 -0
  46. data/test/basic_test.rb +283 -0
  47. data/test/duplicate_names_test.rb +32 -0
  48. data/test/exceptions_test.rb +15 -0
  49. data/test/exclude_threads_test.rb +54 -0
  50. data/test/line_number_test.rb +73 -0
  51. data/test/measurement_test.rb +121 -0
  52. data/test/module_test.rb +54 -0
  53. data/test/no_method_class_test.rb +13 -0
  54. data/test/prime.rb +58 -0
  55. data/test/prime_test.rb +13 -0
  56. data/test/printers_test.rb +71 -0
  57. data/test/recursive_test.rb +254 -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 +159 -0
  63. data/test/unique_call_path_test.rb +206 -0
  64. metadata +124 -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,124 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rdp-ruby-prof
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.7.4
5
+ platform: ruby
6
+ authors:
7
+ - Shugo Maeda and Charlie Savage
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-11-27 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: |
17
+ ruby-prof is a fast code profiler for Ruby. It is a C extension and
18
+ therefore is many times faster than the standard Ruby profiler. It
19
+ supports both flat and graph profiles. For each method, graph profiles
20
+ show how long the method ran, which methods called it and which
21
+ methods it called. RubyProf generate both text and html and can output
22
+ it to standard out or to a file.
23
+
24
+ email: shugo@ruby-lang.org and cfis@savagexi.com
25
+ executables:
26
+ - ruby-prof
27
+ extensions:
28
+ - ext/extconf.rb
29
+ extra_rdoc_files: []
30
+
31
+ files:
32
+ - Rakefile
33
+ - README
34
+ - LICENSE
35
+ - CHANGES
36
+ - bin/ruby-prof
37
+ - examples/flat.txt
38
+ - examples/graph.html
39
+ - examples/graph.txt
40
+ - ext/#ruby_prof.c#
41
+ - ext/extconf.rb
42
+ - ext/Makefile
43
+ - ext/measure_allocations.h
44
+ - ext/measure_cpu_time.h
45
+ - ext/measure_gc_runs.h
46
+ - ext/measure_gc_time.h
47
+ - ext/measure_memory.h
48
+ - ext/measure_process_time.h
49
+ - ext/measure_wall_time.h
50
+ - ext/ruby_prof.c
51
+ - ext/ruby_prof.e
52
+ - ext/ruby_prof.h
53
+ - ext/version.h
54
+ - ext/mingw/Rakefile
55
+ - ext/mingw/build.rake
56
+ - ext/vc/ruby_prof.sln
57
+ - ext/vc/ruby_prof.vcproj
58
+ - lib/ruby-prof/abstract_printer.rb
59
+ - lib/ruby-prof/aggregate_call_info.rb
60
+ - lib/ruby-prof/call_info.rb
61
+ - lib/ruby-prof/call_tree_printer.rb
62
+ - lib/ruby-prof/flat_printer.rb
63
+ - lib/ruby-prof/graph_html_printer.rb
64
+ - lib/ruby-prof/graph_html_printer.rb.orig
65
+ - lib/ruby-prof/graph_html_printer.rb.rej
66
+ - lib/ruby-prof/graph_printer.rb
67
+ - lib/ruby-prof/graph_printer.rb.orig
68
+ - lib/ruby-prof/method_info.rb
69
+ - lib/ruby-prof/task.rb
70
+ - lib/ruby-prof/test.rb
71
+ - lib/ruby-prof.rb
72
+ - lib/unprof.rb
73
+ - rails/environment/profile.rb
74
+ - rails/example/example_test.rb
75
+ - rails/profile_test_helper.rb
76
+ - test/aggregate_test.rb
77
+ - test/basic_test.rb
78
+ - test/duplicate_names_test.rb
79
+ - test/exceptions_test.rb
80
+ - test/exclude_threads_test.rb
81
+ - test/line_number_test.rb
82
+ - test/measurement_test.rb
83
+ - test/module_test.rb
84
+ - test/no_method_class_test.rb
85
+ - test/prime.rb
86
+ - test/prime_test.rb
87
+ - test/printers_test.rb
88
+ - test/recursive_test.rb
89
+ - test/singleton_test.rb
90
+ - test/stack_test.rb
91
+ - test/start_stop_test.rb
92
+ - test/test_suite.rb
93
+ - test/thread_test.rb
94
+ - test/unique_call_path_test.rb
95
+ has_rdoc: true
96
+ homepage: http://rubyforge.org/projects/ruby-prof/
97
+ licenses: []
98
+
99
+ post_install_message:
100
+ rdoc_options: []
101
+
102
+ require_paths:
103
+ - lib
104
+ required_ruby_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: 1.8.4
109
+ version:
110
+ required_rubygems_version: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ version: "0"
115
+ version:
116
+ requirements: []
117
+
118
+ rubyforge_project: ruby-prof
119
+ rubygems_version: 1.3.5
120
+ signing_key:
121
+ specification_version: 3
122
+ summary: Fast Ruby profiler
123
+ test_files:
124
+ - test/test_suite.rb