ruby-prof 1.7.1 → 2.0.0

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 (134) hide show
  1. checksums.yaml +4 -4
  2. data/{CHANGES → CHANGELOG.md} +118 -176
  3. data/README.md +5 -5
  4. data/bin/ruby-prof +1 -4
  5. data/docs/advanced-usage.md +132 -0
  6. data/docs/alternatives.md +98 -0
  7. data/docs/architecture.md +122 -0
  8. data/docs/best-practices.md +27 -0
  9. data/docs/getting-started.md +130 -0
  10. data/docs/history.md +11 -0
  11. data/docs/index.md +45 -0
  12. data/docs/profiling-rails.md +64 -0
  13. data/docs/public/examples/example.rb +33 -0
  14. data/docs/public/examples/generate_reports.rb +92 -0
  15. data/docs/public/examples/reports/call_info.txt +27 -0
  16. data/docs/public/examples/reports/call_stack.html +835 -0
  17. data/docs/public/examples/reports/callgrind.out +150 -0
  18. data/docs/public/examples/reports/flame_graph.html +408 -0
  19. data/docs/public/examples/reports/flat.txt +45 -0
  20. data/docs/public/examples/reports/graph.dot +129 -0
  21. data/docs/public/examples/reports/graph.html +1319 -0
  22. data/docs/public/examples/reports/graph.txt +100 -0
  23. data/docs/public/examples/reports/graphviz_viewer.html +1 -0
  24. data/docs/public/images/call_stack.png +0 -0
  25. data/docs/public/images/class_diagram.png +0 -0
  26. data/docs/public/images/dot_printer.png +0 -0
  27. data/docs/public/images/flame_graph.png +0 -0
  28. data/docs/public/images/flat.png +0 -0
  29. data/docs/public/images/graph.png +0 -0
  30. data/docs/public/images/graph_html.png +0 -0
  31. data/docs/public/images/ruby-prof-logo.svg +1 -0
  32. data/docs/reports.md +150 -0
  33. data/docs/stylesheets/extra.css +80 -0
  34. data/ext/ruby_prof/extconf.rb +23 -22
  35. data/ext/ruby_prof/rp_allocation.c +0 -15
  36. data/ext/ruby_prof/rp_allocation.h +29 -33
  37. data/ext/ruby_prof/rp_call_tree.c +3 -0
  38. data/ext/ruby_prof/rp_call_tree.h +1 -4
  39. data/ext/ruby_prof/rp_call_trees.c +296 -296
  40. data/ext/ruby_prof/rp_call_trees.h +25 -28
  41. data/ext/ruby_prof/rp_measure_allocations.c +47 -47
  42. data/ext/ruby_prof/rp_measure_process_time.c +64 -66
  43. data/ext/ruby_prof/rp_measure_wall_time.c +52 -64
  44. data/ext/ruby_prof/rp_measurement.c +0 -5
  45. data/ext/ruby_prof/rp_measurement.h +49 -53
  46. data/ext/ruby_prof/rp_method.c +554 -551
  47. data/ext/ruby_prof/rp_method.h +1 -4
  48. data/ext/ruby_prof/rp_profile.c +1 -1
  49. data/ext/ruby_prof/rp_profile.h +1 -5
  50. data/ext/ruby_prof/rp_stack.c +212 -212
  51. data/ext/ruby_prof/rp_stack.h +50 -53
  52. data/ext/ruby_prof/rp_thread.h +1 -4
  53. data/ext/ruby_prof/ruby_prof.c +50 -50
  54. data/ext/ruby_prof/ruby_prof.h +4 -6
  55. data/ext/ruby_prof/vc/ruby_prof.vcxproj +7 -8
  56. data/lib/ruby-prof/assets/call_stack_printer.html.erb +746 -711
  57. data/lib/ruby-prof/assets/flame_graph_printer.html.erb +412 -0
  58. data/lib/ruby-prof/assets/graph_printer.html.erb +355 -355
  59. data/lib/ruby-prof/call_tree.rb +57 -57
  60. data/lib/ruby-prof/call_tree_visitor.rb +36 -36
  61. data/lib/ruby-prof/exclude_common_methods.rb +204 -204
  62. data/lib/ruby-prof/measurement.rb +17 -17
  63. data/lib/ruby-prof/printers/abstract_printer.rb +142 -138
  64. data/lib/ruby-prof/printers/call_info_printer.rb +53 -53
  65. data/lib/ruby-prof/printers/call_stack_printer.rb +168 -180
  66. data/lib/ruby-prof/printers/call_tree_printer.rb +132 -145
  67. data/lib/ruby-prof/printers/dot_printer.rb +177 -132
  68. data/lib/ruby-prof/printers/flame_graph_printer.rb +79 -0
  69. data/lib/ruby-prof/printers/flat_printer.rb +52 -52
  70. data/lib/ruby-prof/printers/graph_html_printer.rb +62 -63
  71. data/lib/ruby-prof/printers/graph_printer.rb +112 -113
  72. data/lib/ruby-prof/printers/multi_printer.rb +134 -127
  73. data/lib/ruby-prof/profile.rb +13 -0
  74. data/lib/ruby-prof/rack.rb +114 -105
  75. data/lib/ruby-prof/task.rb +147 -147
  76. data/lib/ruby-prof/thread.rb +20 -20
  77. data/lib/ruby-prof/version.rb +3 -3
  78. data/lib/ruby-prof.rb +50 -52
  79. data/lib/unprof.rb +10 -10
  80. data/ruby-prof.gemspec +66 -65
  81. data/test/abstract_printer_test.rb +25 -27
  82. data/test/alias_test.rb +203 -117
  83. data/test/call_tree_builder.rb +126 -126
  84. data/test/call_tree_visitor_test.rb +27 -27
  85. data/test/call_trees_test.rb +66 -66
  86. data/test/duplicate_names_test.rb +32 -32
  87. data/test/dynamic_method_test.rb +50 -62
  88. data/test/enumerable_test.rb +23 -21
  89. data/test/exceptions_test.rb +24 -24
  90. data/test/exclude_methods_test.rb +363 -257
  91. data/test/exclude_threads_test.rb +48 -48
  92. data/test/fiber_test.rb +195 -195
  93. data/test/gc_test.rb +104 -102
  94. data/test/inverse_call_tree_test.rb +174 -174
  95. data/test/line_number_test.rb +563 -289
  96. data/test/marshal_test.rb +144 -145
  97. data/test/measure_allocations.rb +26 -26
  98. data/test/measure_allocations_test.rb +1511 -1081
  99. data/test/measure_process_time_test.rb +3286 -2477
  100. data/test/measure_times.rb +56 -56
  101. data/test/measure_wall_time_test.rb +773 -568
  102. data/test/measurement_test.rb +82 -82
  103. data/test/merge_test.rb +146 -146
  104. data/test/method_info_test.rb +100 -95
  105. data/test/multi_printer_test.rb +52 -66
  106. data/test/no_method_class_test.rb +15 -15
  107. data/test/pause_resume_test.rb +171 -171
  108. data/test/prime.rb +54 -54
  109. data/test/prime_script.rb +5 -5
  110. data/test/printer_call_stack_test.rb +28 -27
  111. data/test/printer_call_tree_test.rb +30 -30
  112. data/test/printer_flame_graph_test.rb +82 -0
  113. data/test/printer_flat_test.rb +99 -99
  114. data/test/printer_graph_html_test.rb +62 -59
  115. data/test/printer_graph_test.rb +42 -40
  116. data/test/printers_test.rb +162 -135
  117. data/test/printing_recursive_graph_test.rb +81 -81
  118. data/test/profile_test.rb +101 -101
  119. data/test/rack_test.rb +103 -93
  120. data/test/recursive_test.rb +796 -622
  121. data/test/scheduler.rb +4 -0
  122. data/test/singleton_test.rb +39 -38
  123. data/test/stack_printer_test.rb +61 -61
  124. data/test/start_stop_test.rb +106 -106
  125. data/test/test_helper.rb +24 -20
  126. data/test/thread_test.rb +229 -231
  127. data/test/unique_call_path_test.rb +123 -136
  128. data/test/yarv_test.rb +56 -60
  129. metadata +68 -16
  130. data/ext/ruby_prof/rp_measure_memory.c +0 -46
  131. data/lib/ruby-prof/compatibility.rb +0 -113
  132. data/test/compatibility_test.rb +0 -49
  133. data/test/crash2.rb +0 -144
  134. data/test/measure_memory_test.rb +0 -1456
data/test/marshal_test.rb CHANGED
@@ -1,145 +1,144 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- require File.expand_path("../test_helper", __FILE__)
5
- class MarshalTest < TestCase
6
- def verify_profile(profile_1, profile_2)
7
- verify_threads(profile_1.threads, profile_2.threads)
8
- assert_equal(profile_1.measure_mode, profile_2.measure_mode)
9
- assert_equal(profile_1.track_allocations?, profile_2.track_allocations?)
10
- end
11
-
12
- def verify_threads(threads_1, threads_2)
13
- assert_equal(threads_1.count, threads_2.count)
14
- threads_1.count.times do |i|
15
- thread_1 = threads_1[i]
16
- thread_2 = threads_2[i]
17
- assert_nil(thread_2.id)
18
- assert_equal(thread_1.fiber_id, thread_2.fiber_id)
19
- verify_call_info(thread_1.call_tree, thread_2.call_tree)
20
-
21
- verify_methods(thread_1.methods, thread_2.methods)
22
- end
23
- end
24
-
25
- def verify_methods(methods_1, methods_2)
26
- assert_equal(methods_1.count, methods_2.count)
27
-
28
- methods_1.count.times do |i|
29
- method_1 = methods_1[i]
30
- method_2 = methods_2[i]
31
-
32
- assert_equal(method_1.klass_name, method_2.klass_name)
33
- assert_equal(method_1.klass_flags, method_2.klass_flags)
34
-
35
- assert_equal(method_1.method_name, method_2.method_name)
36
- assert_equal(method_1.full_name, method_2.full_name)
37
-
38
- assert_equal(method_1.recursive?, method_2.recursive?)
39
-
40
- if method_1.source_file
41
- assert_equal(method_1.source_file, method_2.source_file)
42
- else
43
- assert_nil(method_1.source_file)
44
- assert_nil(method_2.source_file)
45
- end
46
-
47
- assert_equal(method_1.line, method_2.line)
48
-
49
- verify_measurement(method_1.measurement, method_2.measurement)
50
- verify_call_infos(method_1.call_trees, method_2.call_trees)
51
- verify_allocations(method_1.allocations, method_2.allocations)
52
- end
53
- end
54
-
55
- def verify_allocations(allocations_1, allocations_2)
56
- assert_equal(allocations_1.count, allocations_2.count)
57
-
58
- allocations_1.count.times do |i|
59
- allocation_1 = allocations_1[i]
60
- allocation_2 = allocations_2[i]
61
-
62
- assert_equal(allocation_1.klass_name, allocation_2.klass_name)
63
- assert_equal(allocation_1.klass_flags, allocation_2.klass_flags)
64
-
65
- assert_equal(allocation_1.count, allocation_2.count)
66
- assert_equal(allocation_1.memory, allocation_2.memory)
67
-
68
- assert_equal(allocation_1.source_file, allocation_2.source_file)
69
- assert_equal(allocation_1.line, allocation_2.line)
70
- end
71
- end
72
-
73
- def verify_call_infos(call_infos_1, call_infos_2)
74
- assert_equal(call_infos_1.call_trees.count, call_infos_2.call_trees.count)
75
- call_infos_1.call_trees.count.times do |i|
76
- call_info_1 = call_infos_1.call_trees[i]
77
- call_info_2 = call_infos_2.call_trees[i]
78
- verify_call_info(call_info_1, call_info_2)
79
- end
80
- end
81
-
82
- def verify_call_info(call_info_1, call_info_2)
83
- assert_equal(call_info_1.target, call_info_2.target)
84
-
85
- if call_info_1.parent&.target
86
- assert_equal(call_info_1.parent&.target, call_info_2.parent&.target)
87
- else
88
- assert_nil(call_info_1.parent&.target)
89
- assert_nil(call_info_2.parent&.target)
90
- end
91
-
92
- assert_equal(call_info_1.depth, call_info_2.depth)
93
-
94
- if call_info_1.source_file
95
- assert_equal(call_info_1.source_file, call_info_2.source_file) #
96
- else
97
- assert_nil(call_info_1.source_file)
98
- assert_nil(call_info_2.source_file)
99
- end
100
-
101
- assert_equal(call_info_1.line, call_info_2.line)
102
-
103
- verify_measurement(call_info_1.measurement, call_info_2.measurement)
104
- end
105
-
106
- def verify_measurement(measurement_1, measurement_2)
107
- assert_equal(measurement_1.total_time, measurement_2.total_time)
108
- assert_equal(measurement_1.self_time, measurement_2.self_time)
109
- assert_equal(measurement_1.wait_time, measurement_2.wait_time)
110
- assert_equal(measurement_1.called, measurement_2.called)
111
- end
112
-
113
- def test_marshal_1
114
- profile_1 = RubyProf::Profile.profile(:measure_mode => RubyProf::WALL_TIME) do
115
- 1.times { RubyProf::C1.new.sleep_wait }
116
- end
117
-
118
- data = Marshal.dump(profile_1)
119
- profile_2 = Marshal.load(data)
120
-
121
- verify_profile(profile_1, profile_2)
122
- end
123
-
124
- def test_marshal_2
125
- profile_1 = RubyProf::Profile.profile(:measure_mode => RubyProf::PROCESS_TIME, :track_allocations => true) do
126
- 1.times { RubyProf::C1.new.sleep_wait }
127
- end
128
-
129
- data = Marshal.dump(profile_1)
130
- profile_2 = Marshal.load(data)
131
-
132
- verify_profile(profile_1, profile_2)
133
- end
134
-
135
- def test_singleton
136
- profile_1 = RubyProf::Profile.profile do
137
- SingletonTest.instance.busy_wait
138
- end
139
-
140
- data = Marshal.dump(profile_1)
141
- profile_2 = Marshal.load(data)
142
-
143
- verify_profile(profile_1, profile_2)
144
- end
145
- end
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path("../test_helper", __FILE__)
5
+ class MarshalTest < TestCase
6
+ def verify_profile(profile_1, profile_2)
7
+ verify_threads(profile_1.threads, profile_2.threads)
8
+ assert_equal(profile_1.measure_mode, profile_2.measure_mode)
9
+ assert_equal(profile_1.track_allocations?, profile_2.track_allocations?)
10
+ end
11
+
12
+ def verify_threads(threads_1, threads_2)
13
+ assert_equal(threads_1.count, threads_2.count)
14
+ threads_1.count.times do |i|
15
+ thread_1 = threads_1[i]
16
+ thread_2 = threads_2[i]
17
+ assert_nil(thread_2.id)
18
+ assert_equal(thread_1.fiber_id, thread_2.fiber_id)
19
+ verify_call_info(thread_1.call_tree, thread_2.call_tree)
20
+
21
+ verify_methods(thread_1.methods, thread_2.methods)
22
+ end
23
+ end
24
+
25
+ def verify_methods(methods_1, methods_2)
26
+ assert_equal(methods_1.count, methods_2.count)
27
+
28
+ methods_1.count.times do |i|
29
+ method_1 = methods_1[i]
30
+ method_2 = methods_2[i]
31
+
32
+ assert_equal(method_1.klass_name, method_2.klass_name)
33
+ assert_equal(method_1.klass_flags, method_2.klass_flags)
34
+
35
+ assert_equal(method_1.method_name, method_2.method_name)
36
+ assert_equal(method_1.full_name, method_2.full_name)
37
+
38
+ assert_equal(method_1.recursive?, method_2.recursive?)
39
+
40
+ if method_1.source_file
41
+ assert_equal(method_1.source_file, method_2.source_file)
42
+ else
43
+ assert_nil(method_1.source_file)
44
+ assert_nil(method_2.source_file)
45
+ end
46
+
47
+ assert_equal(method_1.line, method_2.line)
48
+
49
+ verify_measurement(method_1.measurement, method_2.measurement)
50
+ verify_call_infos(method_1.call_trees, method_2.call_trees)
51
+ verify_allocations(method_1.allocations, method_2.allocations)
52
+ end
53
+ end
54
+
55
+ def verify_allocations(allocations_1, allocations_2)
56
+ assert_equal(allocations_1.count, allocations_2.count)
57
+
58
+ allocations_1.count.times do |i|
59
+ allocation_1 = allocations_1[i]
60
+ allocation_2 = allocations_2[i]
61
+
62
+ assert_equal(allocation_1.klass_name, allocation_2.klass_name)
63
+ assert_equal(allocation_1.klass_flags, allocation_2.klass_flags)
64
+
65
+ assert_equal(allocation_1.count, allocation_2.count)
66
+
67
+ assert_equal(allocation_1.source_file, allocation_2.source_file)
68
+ assert_equal(allocation_1.line, allocation_2.line)
69
+ end
70
+ end
71
+
72
+ def verify_call_infos(call_infos_1, call_infos_2)
73
+ assert_equal(call_infos_1.call_trees.count, call_infos_2.call_trees.count)
74
+ call_infos_1.call_trees.count.times do |i|
75
+ call_info_1 = call_infos_1.call_trees[i]
76
+ call_info_2 = call_infos_2.call_trees[i]
77
+ verify_call_info(call_info_1, call_info_2)
78
+ end
79
+ end
80
+
81
+ def verify_call_info(call_info_1, call_info_2)
82
+ assert_equal(call_info_1.target, call_info_2.target)
83
+
84
+ if call_info_1.parent&.target
85
+ assert_equal(call_info_1.parent&.target, call_info_2.parent&.target)
86
+ else
87
+ assert_nil(call_info_1.parent&.target)
88
+ assert_nil(call_info_2.parent&.target)
89
+ end
90
+
91
+ assert_equal(call_info_1.depth, call_info_2.depth)
92
+
93
+ if call_info_1.source_file
94
+ assert_equal(call_info_1.source_file, call_info_2.source_file) #
95
+ else
96
+ assert_nil(call_info_1.source_file)
97
+ assert_nil(call_info_2.source_file)
98
+ end
99
+
100
+ assert_equal(call_info_1.line, call_info_2.line)
101
+
102
+ verify_measurement(call_info_1.measurement, call_info_2.measurement)
103
+ end
104
+
105
+ def verify_measurement(measurement_1, measurement_2)
106
+ assert_equal(measurement_1.total_time, measurement_2.total_time)
107
+ assert_equal(measurement_1.self_time, measurement_2.self_time)
108
+ assert_equal(measurement_1.wait_time, measurement_2.wait_time)
109
+ assert_equal(measurement_1.called, measurement_2.called)
110
+ end
111
+
112
+ def test_marshal_1
113
+ profile_1 = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
114
+ 1.times { RubyProf::C1.new.sleep_wait }
115
+ end
116
+
117
+ data = Marshal.dump(profile_1)
118
+ profile_2 = Marshal.load(data)
119
+
120
+ verify_profile(profile_1, profile_2)
121
+ end
122
+
123
+ def test_marshal_2
124
+ profile_1 = RubyProf::Profile.profile(measure_mode: RubyProf::PROCESS_TIME, track_allocations: true) do
125
+ 1.times { RubyProf::C1.new.sleep_wait }
126
+ end
127
+
128
+ data = Marshal.dump(profile_1)
129
+ profile_2 = Marshal.load(data)
130
+
131
+ verify_profile(profile_1, profile_2)
132
+ end
133
+
134
+ def test_singleton
135
+ profile_1 = RubyProf::Profile.profile do
136
+ SingletonTest.instance.busy_wait
137
+ end
138
+
139
+ data = Marshal.dump(profile_1)
140
+ profile_2 = Marshal.load(data)
141
+
142
+ verify_profile(profile_1, profile_2)
143
+ end
144
+ end
@@ -1,26 +1,26 @@
1
- # Some classes used in measurement tests
2
- class Allocator
3
- def make_arrays
4
- 10.times {|i| Array.new}
5
- end
6
-
7
- def make_hashes
8
- Hash.new
9
- Hash.new
10
- Hash.new
11
- Hash.new
12
- Hash.new
13
- end
14
-
15
- def make_strings
16
- a_string = 'a'
17
- b_string = a_string * 100
18
- String.new(b_string)
19
- end
20
-
21
- def run
22
- make_arrays
23
- make_hashes
24
- make_strings
25
- end
26
- end
1
+ # Some classes used in measurement tests
2
+ class Allocator
3
+ def make_arrays
4
+ 10.times {|i| Array.new}
5
+ end
6
+
7
+ def make_hashes
8
+ Hash.new
9
+ Hash.new
10
+ Hash.new
11
+ Hash.new
12
+ Hash.new
13
+ end
14
+
15
+ def make_strings
16
+ a_string = 'a'
17
+ b_string = a_string * 100
18
+ String.new(b_string)
19
+ end
20
+
21
+ def run
22
+ make_arrays
23
+ make_hashes
24
+ make_strings
25
+ end
26
+ end