airbnb-ruby-prof 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (116) hide show
  1. data/CHANGES +483 -0
  2. data/LICENSE +25 -0
  3. data/README.rdoc +426 -0
  4. data/Rakefile +51 -0
  5. data/bin/ruby-prof +279 -0
  6. data/bin/ruby-prof-check-trace +45 -0
  7. data/examples/flat.txt +50 -0
  8. data/examples/graph.dot +84 -0
  9. data/examples/graph.html +823 -0
  10. data/examples/graph.txt +139 -0
  11. data/examples/multi.flat.txt +23 -0
  12. data/examples/multi.graph.html +760 -0
  13. data/examples/multi.grind.dat +114 -0
  14. data/examples/multi.stack.html +547 -0
  15. data/examples/stack.html +547 -0
  16. data/ext/ruby_prof/extconf.rb +67 -0
  17. data/ext/ruby_prof/rp_call_info.c +374 -0
  18. data/ext/ruby_prof/rp_call_info.h +59 -0
  19. data/ext/ruby_prof/rp_fast_call_tree_printer.c +247 -0
  20. data/ext/ruby_prof/rp_fast_call_tree_printer.h +10 -0
  21. data/ext/ruby_prof/rp_measure.c +71 -0
  22. data/ext/ruby_prof/rp_measure.h +56 -0
  23. data/ext/ruby_prof/rp_measure_allocations.c +74 -0
  24. data/ext/ruby_prof/rp_measure_cpu_time.c +134 -0
  25. data/ext/ruby_prof/rp_measure_gc_runs.c +71 -0
  26. data/ext/ruby_prof/rp_measure_gc_time.c +58 -0
  27. data/ext/ruby_prof/rp_measure_memory.c +75 -0
  28. data/ext/ruby_prof/rp_measure_process_time.c +69 -0
  29. data/ext/ruby_prof/rp_measure_wall_time.c +43 -0
  30. data/ext/ruby_prof/rp_method.c +717 -0
  31. data/ext/ruby_prof/rp_method.h +79 -0
  32. data/ext/ruby_prof/rp_stack.c +221 -0
  33. data/ext/ruby_prof/rp_stack.h +81 -0
  34. data/ext/ruby_prof/rp_thread.c +312 -0
  35. data/ext/ruby_prof/rp_thread.h +36 -0
  36. data/ext/ruby_prof/ruby_prof.c +800 -0
  37. data/ext/ruby_prof/ruby_prof.h +64 -0
  38. data/ext/ruby_prof/vc/ruby_prof.sln +32 -0
  39. data/ext/ruby_prof/vc/ruby_prof_18.vcxproj +108 -0
  40. data/ext/ruby_prof/vc/ruby_prof_19.vcxproj +110 -0
  41. data/ext/ruby_prof/vc/ruby_prof_20.vcxproj +110 -0
  42. data/lib/ruby-prof.rb +63 -0
  43. data/lib/ruby-prof/aggregate_call_info.rb +76 -0
  44. data/lib/ruby-prof/assets/call_stack_printer.css.html +117 -0
  45. data/lib/ruby-prof/assets/call_stack_printer.js.html +385 -0
  46. data/lib/ruby-prof/assets/call_stack_printer.png +0 -0
  47. data/lib/ruby-prof/assets/flame_graph_printer.lib.css.html +149 -0
  48. data/lib/ruby-prof/assets/flame_graph_printer.lib.js.html +707 -0
  49. data/lib/ruby-prof/assets/flame_graph_printer.page.js.html +56 -0
  50. data/lib/ruby-prof/assets/flame_graph_printer.tmpl.html.erb +39 -0
  51. data/lib/ruby-prof/call_info.rb +111 -0
  52. data/lib/ruby-prof/call_info_visitor.rb +40 -0
  53. data/lib/ruby-prof/compatibility.rb +186 -0
  54. data/lib/ruby-prof/method_info.rb +109 -0
  55. data/lib/ruby-prof/printers/abstract_printer.rb +85 -0
  56. data/lib/ruby-prof/printers/call_info_printer.rb +41 -0
  57. data/lib/ruby-prof/printers/call_stack_printer.rb +260 -0
  58. data/lib/ruby-prof/printers/call_tree_printer.rb +130 -0
  59. data/lib/ruby-prof/printers/dot_printer.rb +132 -0
  60. data/lib/ruby-prof/printers/fast_call_tree_printer.rb +87 -0
  61. data/lib/ruby-prof/printers/flame_graph_html_printer.rb +59 -0
  62. data/lib/ruby-prof/printers/flame_graph_json_printer.rb +157 -0
  63. data/lib/ruby-prof/printers/flat_printer.rb +70 -0
  64. data/lib/ruby-prof/printers/flat_printer_with_line_numbers.rb +64 -0
  65. data/lib/ruby-prof/printers/graph_html_printer.rb +244 -0
  66. data/lib/ruby-prof/printers/graph_printer.rb +116 -0
  67. data/lib/ruby-prof/printers/multi_printer.rb +58 -0
  68. data/lib/ruby-prof/profile.rb +22 -0
  69. data/lib/ruby-prof/profile/exclude_common_methods.rb +201 -0
  70. data/lib/ruby-prof/rack.rb +95 -0
  71. data/lib/ruby-prof/task.rb +147 -0
  72. data/lib/ruby-prof/thread.rb +35 -0
  73. data/lib/ruby-prof/version.rb +4 -0
  74. data/lib/ruby-prof/walker.rb +95 -0
  75. data/lib/unprof.rb +10 -0
  76. data/ruby-prof.gemspec +56 -0
  77. data/test/aggregate_test.rb +136 -0
  78. data/test/basic_test.rb +128 -0
  79. data/test/block_test.rb +74 -0
  80. data/test/call_info_test.rb +78 -0
  81. data/test/call_info_visitor_test.rb +31 -0
  82. data/test/duplicate_names_test.rb +32 -0
  83. data/test/dynamic_method_test.rb +55 -0
  84. data/test/enumerable_test.rb +21 -0
  85. data/test/exceptions_test.rb +16 -0
  86. data/test/exclude_methods_test.rb +146 -0
  87. data/test/exclude_threads_test.rb +53 -0
  88. data/test/fiber_test.rb +79 -0
  89. data/test/issue137_test.rb +63 -0
  90. data/test/line_number_test.rb +71 -0
  91. data/test/measure_allocations_test.rb +26 -0
  92. data/test/measure_cpu_time_test.rb +213 -0
  93. data/test/measure_gc_runs_test.rb +32 -0
  94. data/test/measure_gc_time_test.rb +36 -0
  95. data/test/measure_memory_test.rb +33 -0
  96. data/test/measure_process_time_test.rb +63 -0
  97. data/test/measure_wall_time_test.rb +255 -0
  98. data/test/module_test.rb +45 -0
  99. data/test/multi_measure_test.rb +38 -0
  100. data/test/multi_printer_test.rb +83 -0
  101. data/test/no_method_class_test.rb +15 -0
  102. data/test/pause_resume_test.rb +166 -0
  103. data/test/prime.rb +54 -0
  104. data/test/printers_test.rb +255 -0
  105. data/test/printing_recursive_graph_test.rb +127 -0
  106. data/test/rack_test.rb +93 -0
  107. data/test/recursive_test.rb +212 -0
  108. data/test/singleton_test.rb +38 -0
  109. data/test/stack_printer_test.rb +65 -0
  110. data/test/stack_test.rb +138 -0
  111. data/test/start_stop_test.rb +112 -0
  112. data/test/test_helper.rb +264 -0
  113. data/test/thread_test.rb +187 -0
  114. data/test/unique_call_path_test.rb +202 -0
  115. data/test/yarv_test.rb +55 -0
  116. metadata +211 -0
@@ -0,0 +1,187 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+ require 'timeout'
6
+ require 'benchmark'
7
+
8
+ # -- Tests ----
9
+ class ThreadTest < TestCase
10
+ def setup
11
+ # Need to use wall time for this test due to the sleep calls
12
+ RubyProf::measure_mode = RubyProf::WALL_TIME
13
+ end
14
+
15
+ def test_thread_count
16
+ RubyProf.start
17
+
18
+ thread = Thread.new do
19
+ sleep(1)
20
+ end
21
+
22
+ thread.join
23
+ result = RubyProf.stop
24
+ assert_equal(2, result.threads.length)
25
+ end
26
+
27
+ def test_thread_identity
28
+ RubyProf.start
29
+ sleep_thread = Thread.new do
30
+ sleep(1)
31
+ end
32
+ sleep_thread.join
33
+ result = RubyProf.stop
34
+
35
+ thread_ids = result.threads.map {|thread| thread.id}.sort
36
+ threads = [Thread.current, sleep_thread]
37
+ assert_equal(2, result.threads.length)
38
+
39
+ assert(thread_ids.include?(threads[0].object_id))
40
+ assert(thread_ids.include?(threads[1].object_id))
41
+
42
+ assert_instance_of(Thread, ObjectSpace._id2ref(thread_ids[0]))
43
+ assert(threads.include?(ObjectSpace._id2ref(thread_ids[0])))
44
+
45
+ assert_instance_of(Thread, ObjectSpace._id2ref(thread_ids[1]))
46
+ assert(threads.include?(ObjectSpace._id2ref(thread_ids[1])))
47
+ end
48
+
49
+ def test_thread_timings
50
+ RubyProf.start
51
+ thread = Thread.new do
52
+ sleep 0
53
+ # force it to hit thread.join, below, first
54
+ # thus forcing sleep(1), below, to be counted as (wall) self_time
55
+ # since we currently count time "in some other thread" as self.wait_time
56
+ # for whatever reason
57
+ sleep(1)
58
+ end
59
+ thread.join
60
+ result = RubyProf.stop
61
+
62
+ # Check background thread
63
+ assert_equal(2, result.threads.length)
64
+
65
+ rp_thread = result.threads.detect {|t| t.id == thread.object_id}
66
+ methods = rp_thread.methods.sort.reverse
67
+ # fails on travis. why?
68
+ # expected_methods = ["ThreadTest#test_thread_timings", "Kernel#sleep"]
69
+ # assert_equal(expected_methods, methods.map(&:full_name))
70
+
71
+ method = methods[0]
72
+ assert_equal('ThreadTest#test_thread_timings', method.full_name)
73
+ assert_equal(1, method.called)
74
+ assert_in_delta(1, method.total_time, 0.05)
75
+ assert_in_delta(0, method.self_time, 0.05)
76
+ assert_in_delta(0, method.wait_time, 0.05)
77
+ assert_in_delta(1, method.children_time, 0.05)
78
+ assert_equal(1, method.call_infos.length)
79
+ call_info = method.call_infos[0]
80
+ assert_equal('ThreadTest#test_thread_timings', call_info.call_sequence)
81
+ assert_equal(1, call_info.children.length)
82
+
83
+ method = methods[1]
84
+ assert_equal('Kernel#sleep', method.full_name)
85
+ assert_equal(2, method.called)
86
+ assert_in_delta(1, method.total_time, 0.05)
87
+ assert_in_delta(1.0, method.self_time, 0.05)
88
+ assert_in_delta(0, method.wait_time, 0.05)
89
+ assert_in_delta(0, method.children_time, 0.05)
90
+
91
+ assert_equal(1, method.call_infos.length)
92
+ call_info = method.call_infos[0]
93
+ assert_equal('ThreadTest#test_thread_timings->Kernel#sleep', call_info.call_sequence)
94
+ assert_equal(0, call_info.children.length)
95
+
96
+ # Check foreground thread
97
+ rp_thread = result.threads.detect {|athread| athread.id == Thread.current.object_id}
98
+ methods = rp_thread.methods.sort.reverse
99
+ assert_equal(4, methods.length)
100
+ methods = methods.sort.reverse
101
+
102
+ method = methods[0]
103
+ assert_equal('ThreadTest#test_thread_timings', method.full_name)
104
+ # the sub calls to Object#new, when popped,
105
+ # cause the parent frame to be created for method #test_thread_timings, which means a +1 when it's popped in the end
106
+ # xxxx a test that shows it the other way, too (never creates parent frame--if that's even possible)
107
+ assert_equal(1, method.called)
108
+ assert_in_delta(1, method.total_time, 0.05)
109
+ assert_in_delta(0, method.self_time, 0.05)
110
+ assert_in_delta(0, method.wait_time, 0.05)
111
+ assert_in_delta(1, method.children_time, 0.05)
112
+
113
+ assert_equal(1, method.call_infos.length)
114
+ call_info = method.call_infos[0]
115
+ assert_equal('ThreadTest#test_thread_timings', call_info.call_sequence)
116
+ assert_equal(2, call_info.children.length)
117
+
118
+ method = methods[1]
119
+ assert_equal('Thread#join', method.full_name)
120
+ assert_equal(1, method.called)
121
+ assert_in_delta(1, method.total_time, 0.05)
122
+ assert_in_delta(0, method.self_time, 0.05)
123
+ assert_in_delta(1.0, method.wait_time, 0.05)
124
+ assert_in_delta(0, method.children_time, 0.05)
125
+
126
+ assert_equal(1, method.call_infos.length)
127
+ call_info = method.call_infos[0]
128
+ assert_equal('ThreadTest#test_thread_timings->Thread#join', call_info.call_sequence)
129
+ assert_equal(0, call_info.children.length)
130
+
131
+ method = methods[2]
132
+ assert_equal('<Class::Thread>#new', method.full_name)
133
+ assert_equal(1, method.called)
134
+ assert_in_delta(0, method.total_time, 0.05)
135
+ assert_in_delta(0, method.self_time, 0.05)
136
+ assert_in_delta(0, method.wait_time, 0.05)
137
+ assert_in_delta(0, method.children_time, 0.05)
138
+
139
+ assert_equal(1, method.call_infos.length)
140
+ call_info = method.call_infos[0]
141
+ assert_equal('ThreadTest#test_thread_timings-><Class::Thread>#new', call_info.call_sequence)
142
+ assert_equal(1, call_info.children.length)
143
+
144
+ method = methods[3]
145
+ assert_equal('Thread#initialize', method.full_name)
146
+ assert_equal(1, method.called)
147
+ assert_in_delta(0, method.total_time, 0.05)
148
+ assert_in_delta(0, method.self_time, 0.05)
149
+ assert_in_delta(0, method.wait_time, 0.05)
150
+ assert_in_delta(0, method.children_time, 0.05)
151
+
152
+ assert_equal(1, method.call_infos.length)
153
+ call_info = method.call_infos[0]
154
+ assert_equal('ThreadTest#test_thread_timings-><Class::Thread>#new->Thread#initialize', call_info.call_sequence)
155
+ assert_equal(0, call_info.children.length)
156
+ end
157
+
158
+ # useless test: what does it test?
159
+ def test_thread_back_and_forth
160
+ result = nil
161
+ seconds = Benchmark.realtime do
162
+ result = RubyProf.profile do
163
+ a = Thread.new { 100_000.times { sleep 0 }}
164
+ b = Thread.new { 100_000.times { sleep 0 }}
165
+ a.join
166
+ b.join
167
+ end
168
+ end
169
+ methods = result.threads.map {|thread| thread.methods}
170
+ timings = methods.flatten.sort
171
+ assert(timings[-1].total_time < seconds)
172
+ end
173
+
174
+ # useless test: what does it test?
175
+ def test_thread
176
+ RubyProf.profile do
177
+ begin
178
+ Timeout::timeout(2) do
179
+ while true
180
+ next
181
+ end
182
+ end
183
+ rescue Timeout::Error
184
+ end
185
+ end
186
+ end
187
+ end
@@ -0,0 +1,202 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
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
+ end
21
+
22
+ def method_k(i)
23
+ method_a(i)
24
+ end
25
+ end
26
+
27
+
28
+ # -- Tests ----
29
+ class UniqueCallPathTest < TestCase
30
+ def test_root_method
31
+ unique_call_path = UniqueCallPath.new
32
+
33
+ result = RubyProf.profile do
34
+ unique_call_path.method_a(1)
35
+ end
36
+
37
+ root_methods = Array.new
38
+ result.threads.each do |thread|
39
+ thread.methods.each do | m |
40
+ if m.root?
41
+ root_methods.push(m)
42
+ end
43
+ end
44
+ end
45
+
46
+ assert_equal(1, root_methods.length)
47
+ assert_equal("UniqueCallPathTest#test_root_method", root_methods[0].full_name)
48
+ end
49
+
50
+ def test_root_children
51
+ unique_call_path = UniqueCallPath.new
52
+
53
+ result = RubyProf.profile do
54
+ unique_call_path.method_a(1)
55
+ unique_call_path.method_k(2)
56
+ end
57
+
58
+ root_methods = Array.new
59
+ result.threads.each do |thread|
60
+ thread.methods.each do | m |
61
+ if m.root?
62
+ root_methods.push(m)
63
+ end
64
+ end
65
+ end
66
+
67
+ assert_equal(1, root_methods.length)
68
+
69
+ root_children = Array.new
70
+ root_methods[0].children.each do | c |
71
+ if c.parent.target.eql?(root_methods[0])
72
+ root_children.push(c)
73
+ end
74
+ end
75
+
76
+ children = root_children.sort do |c1, c2|
77
+ c1.target.full_name <=> c2.target.full_name
78
+ end
79
+
80
+ assert_equal(2, children.length)
81
+ assert_equal("UniqueCallPath#method_a", children[0].target.full_name)
82
+ assert_equal("UniqueCallPath#method_k", children[1].target.full_name)
83
+ end
84
+
85
+ def test_children_of
86
+ unique_call_path = UniqueCallPath.new
87
+
88
+ result = RubyProf.profile do
89
+ unique_call_path.method_a(1)
90
+ unique_call_path.method_k(2)
91
+ end
92
+
93
+ root_methods = Array.new
94
+ result.threads.each do |thread|
95
+ thread.methods.each do | m |
96
+ if m.root?
97
+ root_methods.push(m)
98
+ end
99
+ end
100
+ end
101
+
102
+ assert_equal(1, root_methods.length)
103
+ method = root_methods[0]
104
+ assert_equal('UniqueCallPathTest#test_children_of', method.full_name)
105
+
106
+ call_info_a = nil
107
+ root_methods[0].children.each do | c |
108
+ if c.target.full_name == "UniqueCallPath#method_a"
109
+ call_info_a = c
110
+ break
111
+ end
112
+ end
113
+
114
+ assert !call_info_a.nil?
115
+
116
+ children_of_a = Array.new
117
+
118
+ call_info_a.children.each do | c |
119
+ if c.parent.eql?(call_info_a)
120
+ children_of_a.push(c)
121
+ end
122
+ end
123
+
124
+ assert_equal(2, call_info_a.target.children.length)
125
+
126
+ children_of_a = children_of_a.sort do |c1, c2|
127
+ c1.target.full_name <=> c2.target.full_name
128
+ end
129
+
130
+ assert_equal(1, children_of_a.length)
131
+ assert_equal("UniqueCallPath#method_b", children_of_a[0].target.full_name)
132
+ end
133
+
134
+ def test_id2ref
135
+ unique_call_path = UniqueCallPath.new
136
+
137
+ result = RubyProf.profile do
138
+ unique_call_path.method_a(1)
139
+ end
140
+
141
+ root_methods = Array.new
142
+ result.threads.each do |thread|
143
+ thread.methods.each do | m |
144
+ if m.root?
145
+ root_methods.push(m)
146
+ end
147
+ end
148
+ end
149
+
150
+ child = root_methods[0].children[0]
151
+
152
+ refute_equal(0, child.object_id)
153
+ #assert_equal(RubyProf::CallInfo.id2ref(child.id).target.full_name, child.target.full_name)
154
+ end
155
+
156
+ def test_unique_path
157
+ unique_call_path = UniqueCallPath.new
158
+
159
+ result = RubyProf.profile do
160
+ unique_call_path.method_a(1)
161
+ unique_call_path.method_k(1)
162
+ end
163
+
164
+ root_methods = Array.new
165
+ result.threads.each do |thread|
166
+ thread.methods.each do | m |
167
+ if m.root?
168
+ root_methods.push(m)
169
+ end
170
+ end
171
+ end
172
+
173
+ assert_equal(1, root_methods.length)
174
+
175
+ call_info_a = nil
176
+ root_methods[0].children.each do | c |
177
+ if c.target.full_name == "UniqueCallPath#method_a"
178
+ call_info_a = c
179
+ break
180
+ end
181
+ end
182
+
183
+ assert !call_info_a.nil?
184
+
185
+ children_of_a = Array.new
186
+ call_info_a.children.each do |c|
187
+ if c.parent.eql?(call_info_a)
188
+ children_of_a.push(c)
189
+ end
190
+ end
191
+
192
+ assert_equal(2, call_info_a.target.children.length)
193
+
194
+ children_of_a = children_of_a.sort do |c1, c2|
195
+ c1.target.full_name <=> c2.target.full_name
196
+ end
197
+
198
+ assert_equal(1, children_of_a.length)
199
+ assert_equal(1, children_of_a[0].called)
200
+ assert_equal("UniqueCallPath#method_b", children_of_a[0].target.full_name)
201
+ end
202
+ end
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+
6
+ # tests for bugs reported by users
7
+ class BugsTest < TestCase
8
+ def setup
9
+ RubyProf::measure_mode = RubyProf::WALL_TIME
10
+ define_methods
11
+ end
12
+
13
+ def test_array_push_unoptimized
14
+ a = nil
15
+ result = RubyProf.profile do
16
+ a = self.array_push_unoptimized
17
+ end
18
+ assert_equal 2, a.length
19
+ assert_equal ["BugsTest#test_array_push_unoptimized", "BugsTest#array_push_unoptimized", 'Array#<<', "Array#push"], result.threads.first.methods.map(&:full_name)
20
+ end
21
+
22
+ def test_array_push_optimized
23
+ a = nil
24
+ result = RubyProf.profile do
25
+ a = self.array_push_optimized
26
+ end
27
+ assert_equal 2, a.length
28
+ assert_equal ["BugsTest#test_array_push_optimized", "BugsTest#array_push_optimized", "Array#push"], result.threads.first.methods.map(&:full_name)
29
+ end
30
+
31
+ private
32
+ def define_methods
33
+ return if respond_to?(:array_push_optimized)
34
+ old_compile_option = RubyVM::InstructionSequence.compile_option
35
+ RubyVM::InstructionSequence.compile_option = {
36
+ :trace_instruction => true,
37
+ :specialized_instruction => false
38
+ }
39
+ self.class.class_eval <<-"EOM"
40
+ def array_push_unoptimized
41
+ a = []
42
+ a << 1
43
+ a.push 2
44
+ end
45
+ EOM
46
+ RubyVM::InstructionSequence.compile_option = old_compile_option
47
+ self.class.class_eval <<-"EOM"
48
+ def array_push_optimized
49
+ a = []
50
+ a << 1
51
+ a.push 2
52
+ end
53
+ EOM
54
+ end
55
+ end
metadata ADDED
@@ -0,0 +1,211 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: airbnb-ruby-prof
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.0.1
6
+ platform: ruby
7
+ authors:
8
+ - Shugo Maeda, Charlie Savage, Roger Pack, Stefan Kaes
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2017-04-03 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ version_requirements: !ruby/object:Gem::Requirement
16
+ none: false
17
+ requirements:
18
+ - - ~>
19
+ - !ruby/object:Gem::Version
20
+ version: 5.8.3
21
+ name: minitest
22
+ type: :development
23
+ requirement: !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ~>
27
+ - !ruby/object:Gem::Version
28
+ version: 5.8.3
29
+ prerelease: false
30
+ - !ruby/object:Gem::Dependency
31
+ version_requirements: !ruby/object:Gem::Requirement
32
+ none: false
33
+ requirements:
34
+ - - ! '>='
35
+ - !ruby/object:Gem::Version
36
+ version: '0'
37
+ name: rake-compiler
38
+ type: :development
39
+ requirement: !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ prerelease: false
46
+ description: ! 'ruby-prof is a fast code profiler for Ruby. It is a C extension and
47
+
48
+ therefore is many times faster than the standard Ruby profiler. It
49
+
50
+ supports both flat and graph profiles. For each method, graph profiles
51
+
52
+ show how long the method ran, which methods called it and which
53
+
54
+ methods it called. RubyProf generate both text and html and can output
55
+
56
+ it to standard out or to a file.
57
+
58
+ '
59
+ email: shugo@ruby-lang.org, cfis@savagexi.com, rogerdpack@gmail.com, skaes@railsexpress.de
60
+ executables:
61
+ - ruby-prof
62
+ - ruby-prof-check-trace
63
+ extensions:
64
+ - ext/ruby_prof/extconf.rb
65
+ extra_rdoc_files: []
66
+ files:
67
+ - CHANGES
68
+ - LICENSE
69
+ - Rakefile
70
+ - README.rdoc
71
+ - ruby-prof.gemspec
72
+ - bin/ruby-prof
73
+ - bin/ruby-prof-check-trace
74
+ - examples/flat.txt
75
+ - examples/graph.dot
76
+ - examples/graph.html
77
+ - examples/graph.txt
78
+ - examples/multi.flat.txt
79
+ - examples/multi.graph.html
80
+ - examples/multi.grind.dat
81
+ - examples/multi.stack.html
82
+ - examples/stack.html
83
+ - ext/ruby_prof/extconf.rb
84
+ - ext/ruby_prof/rp_call_info.c
85
+ - ext/ruby_prof/rp_fast_call_tree_printer.c
86
+ - ext/ruby_prof/rp_measure.c
87
+ - ext/ruby_prof/rp_measure_allocations.c
88
+ - ext/ruby_prof/rp_measure_cpu_time.c
89
+ - ext/ruby_prof/rp_measure_gc_runs.c
90
+ - ext/ruby_prof/rp_measure_gc_time.c
91
+ - ext/ruby_prof/rp_measure_memory.c
92
+ - ext/ruby_prof/rp_measure_process_time.c
93
+ - ext/ruby_prof/rp_measure_wall_time.c
94
+ - ext/ruby_prof/rp_method.c
95
+ - ext/ruby_prof/rp_stack.c
96
+ - ext/ruby_prof/rp_thread.c
97
+ - ext/ruby_prof/ruby_prof.c
98
+ - ext/ruby_prof/rp_call_info.h
99
+ - ext/ruby_prof/rp_fast_call_tree_printer.h
100
+ - ext/ruby_prof/rp_measure.h
101
+ - ext/ruby_prof/rp_method.h
102
+ - ext/ruby_prof/rp_stack.h
103
+ - ext/ruby_prof/rp_thread.h
104
+ - ext/ruby_prof/ruby_prof.h
105
+ - ext/ruby_prof/vc/ruby_prof.sln
106
+ - ext/ruby_prof/vc/ruby_prof_18.vcxproj
107
+ - ext/ruby_prof/vc/ruby_prof_19.vcxproj
108
+ - ext/ruby_prof/vc/ruby_prof_20.vcxproj
109
+ - lib/ruby-prof.rb
110
+ - lib/unprof.rb
111
+ - lib/ruby-prof/aggregate_call_info.rb
112
+ - lib/ruby-prof/call_info.rb
113
+ - lib/ruby-prof/call_info_visitor.rb
114
+ - lib/ruby-prof/compatibility.rb
115
+ - lib/ruby-prof/method_info.rb
116
+ - lib/ruby-prof/profile.rb
117
+ - lib/ruby-prof/rack.rb
118
+ - lib/ruby-prof/task.rb
119
+ - lib/ruby-prof/thread.rb
120
+ - lib/ruby-prof/version.rb
121
+ - lib/ruby-prof/walker.rb
122
+ - lib/ruby-prof/assets/call_stack_printer.css.html
123
+ - lib/ruby-prof/assets/call_stack_printer.js.html
124
+ - lib/ruby-prof/assets/flame_graph_printer.lib.css.html
125
+ - lib/ruby-prof/assets/flame_graph_printer.lib.js.html
126
+ - lib/ruby-prof/assets/flame_graph_printer.page.js.html
127
+ - lib/ruby-prof/assets/call_stack_printer.png
128
+ - lib/ruby-prof/assets/flame_graph_printer.tmpl.html.erb
129
+ - lib/ruby-prof/profile/exclude_common_methods.rb
130
+ - lib/ruby-prof/printers/abstract_printer.rb
131
+ - lib/ruby-prof/printers/call_info_printer.rb
132
+ - lib/ruby-prof/printers/call_stack_printer.rb
133
+ - lib/ruby-prof/printers/call_tree_printer.rb
134
+ - lib/ruby-prof/printers/dot_printer.rb
135
+ - lib/ruby-prof/printers/fast_call_tree_printer.rb
136
+ - lib/ruby-prof/printers/flame_graph_html_printer.rb
137
+ - lib/ruby-prof/printers/flame_graph_json_printer.rb
138
+ - lib/ruby-prof/printers/flat_printer.rb
139
+ - lib/ruby-prof/printers/flat_printer_with_line_numbers.rb
140
+ - lib/ruby-prof/printers/graph_html_printer.rb
141
+ - lib/ruby-prof/printers/graph_printer.rb
142
+ - lib/ruby-prof/printers/multi_printer.rb
143
+ - test/aggregate_test.rb
144
+ - test/basic_test.rb
145
+ - test/block_test.rb
146
+ - test/call_info_test.rb
147
+ - test/call_info_visitor_test.rb
148
+ - test/duplicate_names_test.rb
149
+ - test/dynamic_method_test.rb
150
+ - test/enumerable_test.rb
151
+ - test/exceptions_test.rb
152
+ - test/exclude_methods_test.rb
153
+ - test/exclude_threads_test.rb
154
+ - test/fiber_test.rb
155
+ - test/issue137_test.rb
156
+ - test/line_number_test.rb
157
+ - test/measure_allocations_test.rb
158
+ - test/measure_cpu_time_test.rb
159
+ - test/measure_gc_runs_test.rb
160
+ - test/measure_gc_time_test.rb
161
+ - test/measure_memory_test.rb
162
+ - test/measure_process_time_test.rb
163
+ - test/measure_wall_time_test.rb
164
+ - test/module_test.rb
165
+ - test/multi_measure_test.rb
166
+ - test/multi_printer_test.rb
167
+ - test/no_method_class_test.rb
168
+ - test/pause_resume_test.rb
169
+ - test/prime.rb
170
+ - test/printers_test.rb
171
+ - test/printing_recursive_graph_test.rb
172
+ - test/rack_test.rb
173
+ - test/recursive_test.rb
174
+ - test/singleton_test.rb
175
+ - test/stack_printer_test.rb
176
+ - test/stack_test.rb
177
+ - test/start_stop_test.rb
178
+ - test/test_helper.rb
179
+ - test/thread_test.rb
180
+ - test/unique_call_path_test.rb
181
+ - test/yarv_test.rb
182
+ homepage: https://github.com/ruby-prof/ruby-prof
183
+ licenses:
184
+ - BSD-2-Clause
185
+ post_install_message:
186
+ rdoc_options: []
187
+ require_paths:
188
+ - lib
189
+ required_ruby_version: !ruby/object:Gem::Requirement
190
+ none: false
191
+ requirements:
192
+ - - ! '>='
193
+ - !ruby/object:Gem::Version
194
+ version: 1.9.3
195
+ required_rubygems_version: !ruby/object:Gem::Requirement
196
+ none: false
197
+ requirements:
198
+ - - ! '>='
199
+ - !ruby/object:Gem::Version
200
+ segments:
201
+ - 0
202
+ hash: 2681757346368382202
203
+ version: '0'
204
+ requirements: []
205
+ rubyforge_project:
206
+ rubygems_version: 1.8.23
207
+ signing_key:
208
+ specification_version: 3
209
+ summary: Fast Ruby profiler
210
+ test_files:
211
+ - test/test_helper.rb