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
@@ -1,126 +1,126 @@
1
- # frozen_string_literal: true
2
-
3
- require File.expand_path('../test_helper', __FILE__)
4
- require 'base64'
5
-
6
- # Create a DummyClass with methods so we can create call trees in the test_merge method below
7
- class DummyClass
8
- %i[root a b aa ab ba bb].each do |method_name|
9
- define_method(method_name) do
10
- end
11
- end
12
- end
13
-
14
- def create_call_tree(method_name)
15
- method_info = RubyProf::MethodInfo.new(DummyClass, method_name)
16
- RubyProf::CallTree.new(method_info)
17
- end
18
-
19
- def build_call_tree(tree_hash)
20
- # tree_hash is a hash keyed on the parent method_name whose values are
21
- # child methods. Example:
22
- #
23
- # tree_hash = {:root => [:a, :b],
24
- # :a => [:aa, :ab],
25
- # :b => [:bb]}
26
- #
27
- # Note this is a simplified structure for testing. It assumes methods
28
- # are only called from one call_tree.
29
-
30
- call_trees = Hash.new
31
- tree_hash.each do |method_name, children|
32
- parent = call_trees[method_name] ||= create_call_tree(method_name)
33
- children.each do |child_method_name|
34
- child = call_trees[child_method_name] ||= create_call_tree(child_method_name)
35
- parent.add_child(child)
36
- end
37
- end
38
-
39
- call_trees
40
- end
41
-
42
- def create_call_tree_1
43
- #
44
- # root
45
- # / \
46
- # a b
47
- # / \ \
48
- # aa ab bb
49
- #
50
-
51
- # ------ Call Trees 1 -------------
52
- tree_hash = {:root => [:a, :b],
53
- :a => [:aa, :ab],
54
- :b => [:bb]}
55
-
56
- call_trees = build_call_tree(tree_hash)
57
-
58
- # Setup times
59
- call_trees[:aa].measurement.total_time = 1.5
60
- call_trees[:aa].measurement.self_time = 1.5
61
- call_trees[:ab].measurement.total_time = 2.2
62
- call_trees[:ab].measurement.self_time = 2.2
63
- call_trees[:a].measurement.total_time = 3.7
64
-
65
- call_trees[:aa].target.measurement.total_time = 1.5
66
- call_trees[:aa].target.measurement.self_time = 1.5
67
- call_trees[:ab].target.measurement.total_time = 2.2
68
- call_trees[:ab].target.measurement.self_time = 2.2
69
- call_trees[:a].target.measurement.total_time = 3.7
70
-
71
- call_trees[:bb].measurement.total_time = 4.3
72
- call_trees[:bb].measurement.self_time = 4.3
73
- call_trees[:b].measurement.total_time = 4.3
74
-
75
- call_trees[:bb].target.measurement.total_time = 4.3
76
- call_trees[:bb].target.measurement.self_time = 4.3
77
- call_trees[:b].target.measurement.total_time = 4.3
78
-
79
- call_trees[:root].measurement.total_time = 8.0
80
- call_trees[:root].target.measurement.total_time = 8.0
81
-
82
- call_trees[:root]
83
- end
84
-
85
- def create_call_tree_2
86
- #
87
- # root
88
- # / \
89
- # a b
90
- # \ / \
91
- # ab ba bb
92
-
93
- tree_hash = {:root => [:a, :b],
94
- :a => [:ab],
95
- :b => [:ba, :bb]}
96
-
97
- call_trees = build_call_tree(tree_hash)
98
-
99
- # Setup times
100
- call_trees[:ab].measurement.total_time = 0.4
101
- call_trees[:ab].measurement.self_time = 0.4
102
- call_trees[:a].measurement.total_time = 0.4
103
-
104
- call_trees[:ab].target.measurement.total_time = 0.4
105
- call_trees[:ab].target.measurement.self_time = 0.4
106
- call_trees[:a].target.measurement.total_time = 0.4
107
-
108
- call_trees[:ba].measurement.total_time = 0.9
109
- call_trees[:ba].measurement.self_time = 0.7
110
- call_trees[:ba].measurement.wait_time = 0.2
111
- call_trees[:bb].measurement.total_time = 2.3
112
- call_trees[:bb].measurement.self_time = 2.3
113
- call_trees[:b].measurement.total_time = 3.2
114
-
115
- call_trees[:ba].target.measurement.total_time = 0.9
116
- call_trees[:ba].target.measurement.self_time = 0.7
117
- call_trees[:ba].target.measurement.wait_time = 0.2
118
- call_trees[:bb].target.measurement.total_time = 2.3
119
- call_trees[:bb].target.measurement.self_time = 2.3
120
- call_trees[:b].target.measurement.total_time = 3.2
121
-
122
- call_trees[:root].measurement.total_time = 3.6
123
- call_trees[:root].target.measurement.total_time = 3.6
124
-
125
- call_trees[:root]
126
- end
1
+ # frozen_string_literal: true
2
+
3
+ require File.expand_path('../test_helper', __FILE__)
4
+ require 'base64'
5
+
6
+ # Create a DummyClass with methods so we can create call trees in the test_merge method below
7
+ class DummyClass
8
+ %i[root a b aa ab ba bb].each do |method_name|
9
+ define_method(method_name) do
10
+ end
11
+ end
12
+ end
13
+
14
+ def create_call_tree(method_name)
15
+ method_info = RubyProf::MethodInfo.new(DummyClass, method_name)
16
+ RubyProf::CallTree.new(method_info)
17
+ end
18
+
19
+ def build_call_tree(tree_hash)
20
+ # tree_hash is a hash keyed on the parent method_name whose values are
21
+ # child methods. Example:
22
+ #
23
+ # tree_hash = {root: [:a, :b],
24
+ # a: [:aa, :ab],
25
+ # b: [:bb]}
26
+ #
27
+ # Note this is a simplified structure for testing. It assumes methods
28
+ # are only called from one call_tree.
29
+
30
+ call_trees = Hash.new
31
+ tree_hash.each do |method_name, children|
32
+ parent = call_trees[method_name] ||= create_call_tree(method_name)
33
+ children.each do |child_method_name|
34
+ child = call_trees[child_method_name] ||= create_call_tree(child_method_name)
35
+ parent.add_child(child)
36
+ end
37
+ end
38
+
39
+ call_trees
40
+ end
41
+
42
+ def create_call_tree_1
43
+ #
44
+ # root
45
+ # / \
46
+ # a b
47
+ # / \ \
48
+ # aa ab bb
49
+ #
50
+
51
+ # ------ Call Trees 1 -------------
52
+ tree_hash = {root: [:a, :b],
53
+ a: [:aa, :ab],
54
+ b: [:bb]}
55
+
56
+ call_trees = build_call_tree(tree_hash)
57
+
58
+ # Setup times
59
+ call_trees[:aa].measurement.total_time = 1.5
60
+ call_trees[:aa].measurement.self_time = 1.5
61
+ call_trees[:ab].measurement.total_time = 2.2
62
+ call_trees[:ab].measurement.self_time = 2.2
63
+ call_trees[:a].measurement.total_time = 3.7
64
+
65
+ call_trees[:aa].target.measurement.total_time = 1.5
66
+ call_trees[:aa].target.measurement.self_time = 1.5
67
+ call_trees[:ab].target.measurement.total_time = 2.2
68
+ call_trees[:ab].target.measurement.self_time = 2.2
69
+ call_trees[:a].target.measurement.total_time = 3.7
70
+
71
+ call_trees[:bb].measurement.total_time = 4.3
72
+ call_trees[:bb].measurement.self_time = 4.3
73
+ call_trees[:b].measurement.total_time = 4.3
74
+
75
+ call_trees[:bb].target.measurement.total_time = 4.3
76
+ call_trees[:bb].target.measurement.self_time = 4.3
77
+ call_trees[:b].target.measurement.total_time = 4.3
78
+
79
+ call_trees[:root].measurement.total_time = 8.0
80
+ call_trees[:root].target.measurement.total_time = 8.0
81
+
82
+ call_trees[:root]
83
+ end
84
+
85
+ def create_call_tree_2
86
+ #
87
+ # root
88
+ # / \
89
+ # a b
90
+ # \ / \
91
+ # ab ba bb
92
+
93
+ tree_hash = {root: [:a, :b],
94
+ a: [:ab],
95
+ b: [:ba, :bb]}
96
+
97
+ call_trees = build_call_tree(tree_hash)
98
+
99
+ # Setup times
100
+ call_trees[:ab].measurement.total_time = 0.4
101
+ call_trees[:ab].measurement.self_time = 0.4
102
+ call_trees[:a].measurement.total_time = 0.4
103
+
104
+ call_trees[:ab].target.measurement.total_time = 0.4
105
+ call_trees[:ab].target.measurement.self_time = 0.4
106
+ call_trees[:a].target.measurement.total_time = 0.4
107
+
108
+ call_trees[:ba].measurement.total_time = 0.9
109
+ call_trees[:ba].measurement.self_time = 0.7
110
+ call_trees[:ba].measurement.wait_time = 0.2
111
+ call_trees[:bb].measurement.total_time = 2.3
112
+ call_trees[:bb].measurement.self_time = 2.3
113
+ call_trees[:b].measurement.total_time = 3.2
114
+
115
+ call_trees[:ba].target.measurement.total_time = 0.9
116
+ call_trees[:ba].target.measurement.self_time = 0.7
117
+ call_trees[:ba].target.measurement.wait_time = 0.2
118
+ call_trees[:bb].target.measurement.total_time = 2.3
119
+ call_trees[:bb].target.measurement.self_time = 2.3
120
+ call_trees[:b].target.measurement.total_time = 3.2
121
+
122
+ call_trees[:root].measurement.total_time = 3.6
123
+ call_trees[:root].target.measurement.total_time = 3.6
124
+
125
+ call_trees[:root]
126
+ end
@@ -1,27 +1,27 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- require File.expand_path('../test_helper', __FILE__)
5
- require_relative './measure_times'
6
-
7
- class CallTreeVisitorTest < TestCase
8
- def test_visit
9
- result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
10
- RubyProf::C1.sleep_wait
11
- end
12
-
13
- visitor = RubyProf::CallTreeVisitor.new(result.threads.first.call_tree)
14
-
15
- method_names = Array.new
16
-
17
- visitor.visit do |call_tree, event|
18
- method_names << call_tree.target.full_name if event == :enter
19
- end
20
-
21
- assert_equal(3, method_names.length)
22
- assert_equal("CallTreeVisitorTest#test_visit", method_names[0])
23
- assert_equal("<Class::RubyProf::C1>#sleep_wait", method_names[1])
24
- assert_equal("Kernel#sleep", method_names[2])
25
- end
26
- end
27
-
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+ require_relative './measure_times'
6
+
7
+ class CallTreeVisitorTest < TestCase
8
+ def test_visit
9
+ result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
10
+ RubyProf::C1.sleep_wait
11
+ end
12
+
13
+ visitor = RubyProf::CallTreeVisitor.new(result.threads.first.call_tree)
14
+
15
+ method_names = Array.new
16
+
17
+ visitor.visit do |call_tree, event|
18
+ method_names << call_tree.target.full_name if event == :enter
19
+ end
20
+
21
+ assert_equal(3, method_names.length)
22
+ assert_equal("CallTreeVisitorTest#test_visit", method_names[0])
23
+ assert_equal("<Class::RubyProf::C1>#sleep_wait", method_names[1])
24
+ assert_equal("Kernel#sleep", method_names[2])
25
+ end
26
+ end
27
+
@@ -1,66 +1,66 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- require File.expand_path('../test_helper', __FILE__)
5
-
6
- # -- Tests ----
7
- class CallTreesTest < TestCase
8
- def some_method_1
9
- some_method_2
10
- end
11
-
12
- def some_method_2
13
- end
14
-
15
- def test_call_infos
16
- result = RubyProf::Profile.profile do
17
- some_method_1
18
- end
19
-
20
- thread = result.threads.first
21
- assert_equal(3, thread.methods.length)
22
-
23
- method = thread.methods[0]
24
- assert_equal('CallTreesTest#test_call_infos', method.full_name)
25
-
26
- call_trees = method.call_trees
27
- assert_empty(call_trees.callers)
28
- assert_equal(1, call_trees.callees.length)
29
- assert_kind_of(RubyProf::CallTree, call_trees.callees[0])
30
- assert_equal('CallTreesTest#some_method_1', call_trees.callees[0].target.full_name)
31
-
32
- method = thread.methods[1]
33
- assert_equal('CallTreesTest#some_method_1', method.full_name)
34
-
35
- call_trees = method.call_trees
36
- assert_equal(1, call_trees.callers.length)
37
- assert_kind_of(RubyProf::CallTree, call_trees.callers[0])
38
- assert_equal('CallTreesTest#test_call_infos', call_trees.callers[0].parent.target.full_name)
39
- assert_equal(1, call_trees.callees.length)
40
- assert_kind_of(RubyProf::CallTree, call_trees.callees[0])
41
- assert_equal('CallTreesTest#some_method_2', call_trees.callees[0].target.full_name)
42
-
43
- method = thread.methods[2]
44
- assert_equal('CallTreesTest#some_method_2', method.full_name)
45
-
46
- call_trees = method.call_trees
47
- assert_equal(1, call_trees.callers.length)
48
- assert_kind_of(RubyProf::CallTree, call_trees.callers[0])
49
- assert_equal('CallTreesTest#some_method_1', call_trees.callers[0].parent.target.full_name)
50
- assert_empty(call_trees.callees)
51
- end
52
-
53
- def test_gc
54
- result = RubyProf::Profile.profile do
55
- some_method_1
56
- end
57
-
58
- method = result.threads.first.methods[1]
59
-
60
- 100.times do |i|
61
- method.call_trees.callers
62
- GC.start
63
- end
64
- assert(true)
65
- end
66
- end
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+
6
+ # -- Tests ----
7
+ class CallTreesTest < TestCase
8
+ def some_method_1
9
+ some_method_2
10
+ end
11
+
12
+ def some_method_2
13
+ end
14
+
15
+ def test_call_infos
16
+ result = RubyProf::Profile.profile do
17
+ some_method_1
18
+ end
19
+
20
+ thread = result.threads.first
21
+ assert_equal(3, thread.methods.length)
22
+
23
+ method = thread.methods[0]
24
+ assert_equal('CallTreesTest#test_call_infos', method.full_name)
25
+
26
+ call_trees = method.call_trees
27
+ assert_empty(call_trees.callers)
28
+ assert_equal(1, call_trees.callees.length)
29
+ assert_kind_of(RubyProf::CallTree, call_trees.callees[0])
30
+ assert_equal('CallTreesTest#some_method_1', call_trees.callees[0].target.full_name)
31
+
32
+ method = thread.methods[1]
33
+ assert_equal('CallTreesTest#some_method_1', method.full_name)
34
+
35
+ call_trees = method.call_trees
36
+ assert_equal(1, call_trees.callers.length)
37
+ assert_kind_of(RubyProf::CallTree, call_trees.callers[0])
38
+ assert_equal('CallTreesTest#test_call_infos', call_trees.callers[0].parent.target.full_name)
39
+ assert_equal(1, call_trees.callees.length)
40
+ assert_kind_of(RubyProf::CallTree, call_trees.callees[0])
41
+ assert_equal('CallTreesTest#some_method_2', call_trees.callees[0].target.full_name)
42
+
43
+ method = thread.methods[2]
44
+ assert_equal('CallTreesTest#some_method_2', method.full_name)
45
+
46
+ call_trees = method.call_trees
47
+ assert_equal(1, call_trees.callers.length)
48
+ assert_kind_of(RubyProf::CallTree, call_trees.callers[0])
49
+ assert_equal('CallTreesTest#some_method_1', call_trees.callers[0].parent.target.full_name)
50
+ assert_empty(call_trees.callees)
51
+ end
52
+
53
+ def test_gc
54
+ result = RubyProf::Profile.profile do
55
+ some_method_1
56
+ end
57
+
58
+ method = result.threads.first.methods[1]
59
+
60
+ 100.times do |i|
61
+ method.call_trees.callers
62
+ GC.start
63
+ end
64
+ assert(true)
65
+ end
66
+ end
@@ -1,32 +1,32 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- require File.expand_path('../test_helper', __FILE__)
5
-
6
- class DuplicateNamesTest < TestCase
7
- def test_names
8
- result = RubyProf::Profile.profile do
9
- str = %{module Foo; class Bar; def foo; end end end}
10
-
11
- eval str
12
- Foo::Bar.new.foo
13
- DuplicateNamesTest.class_eval {remove_const :Foo}
14
-
15
- eval str
16
- Foo::Bar.new.foo
17
- DuplicateNamesTest.class_eval {remove_const :Foo}
18
-
19
- eval str
20
- Foo::Bar.new.foo
21
- end
22
-
23
- # There should be 3 foo methods
24
- methods = result.threads.first.methods.sort.reverse
25
-
26
- methods = methods.select do |method|
27
- method.full_name == 'DuplicateNamesTest::Foo::Bar#foo'
28
- end
29
-
30
- assert_equal(3, methods.length)
31
- end
32
- end
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+
6
+ class DuplicateNamesTest < TestCase
7
+ def test_names
8
+ result = RubyProf::Profile.profile do
9
+ str = %{module Foo; class Bar; def foo; end end end}
10
+
11
+ eval str
12
+ Foo::Bar.new.foo
13
+ DuplicateNamesTest.class_eval {remove_const :Foo}
14
+
15
+ eval str
16
+ Foo::Bar.new.foo
17
+ DuplicateNamesTest.class_eval {remove_const :Foo}
18
+
19
+ eval str
20
+ Foo::Bar.new.foo
21
+ end
22
+
23
+ # There should be 3 foo methods
24
+ methods = result.threads.first.methods.sort.reverse
25
+
26
+ methods = methods.select do |method|
27
+ method.full_name == 'DuplicateNamesTest::Foo::Bar#foo'
28
+ end
29
+
30
+ assert_equal(3, methods.length)
31
+ end
32
+ end
@@ -1,62 +1,50 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- require File.expand_path("../test_helper", __FILE__)
5
-
6
- class DynamicMethodTest < TestCase
7
-
8
- class FruitMedley
9
- define_method(:apple) do
10
- sleep(0.1)
11
- "I'm a peach"
12
- end
13
-
14
- define_method(:orange) do
15
- sleep(0.2)
16
- "I'm an orange"
17
- end
18
-
19
- [:banana, :peach].each_with_index do |fruit,i|
20
- define_method(fruit) do
21
- sleep(i == 0 ? 0.3 : 0.4)
22
- "I'm a #{fruit}"
23
- end
24
- end
25
- end
26
-
27
- def test_dynamic_method
28
- medley = FruitMedley.new
29
- result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
30
- medley.apple
31
- medley.orange
32
- medley.banana
33
- medley.peach
34
- end
35
-
36
- methods = result.threads.first.methods.sort.reverse
37
-
38
- if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.1')
39
- expected_method_names = %w(
40
- DynamicMethodTest#test_dynamic_method
41
- Kernel#sleep
42
- DynamicMethodTest::FruitMedley#peach
43
- DynamicMethodTest::FruitMedley#banana
44
- DynamicMethodTest::FruitMedley#orange
45
- DynamicMethodTest::FruitMedley#apple
46
- Symbol#to_s
47
- )
48
- else
49
- expected_method_names = %w(
50
- DynamicMethodTest#test_dynamic_method
51
- Kernel#sleep
52
- DynamicMethodTest::FruitMedley#peach
53
- DynamicMethodTest::FruitMedley#banana
54
- DynamicMethodTest::FruitMedley#orange
55
- DynamicMethodTest::FruitMedley#apple
56
- Integer#==
57
- )
58
- end
59
-
60
- assert_equal expected_method_names.join("\n"), methods.map(&:full_name).join("\n")
61
- end
62
- end
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path("../test_helper", __FILE__)
5
+
6
+ class DynamicMethodTest < TestCase
7
+
8
+ class FruitMedley
9
+ define_method(:apple) do
10
+ sleep(0.1)
11
+ "I'm a peach"
12
+ end
13
+
14
+ define_method(:orange) do
15
+ sleep(0.2)
16
+ "I'm an orange"
17
+ end
18
+
19
+ [:banana, :peach].each_with_index do |fruit,i|
20
+ define_method(fruit) do
21
+ sleep(i == 0 ? 0.3 : 0.4)
22
+ "I'm a #{fruit}"
23
+ end
24
+ end
25
+ end
26
+
27
+ def test_dynamic_method
28
+ medley = FruitMedley.new
29
+ result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
30
+ medley.apple
31
+ medley.orange
32
+ medley.banana
33
+ medley.peach
34
+ end
35
+
36
+ methods = result.threads.first.methods.sort.reverse
37
+
38
+ expected_method_names = %w(
39
+ DynamicMethodTest#test_dynamic_method
40
+ Kernel#sleep
41
+ DynamicMethodTest::FruitMedley#peach
42
+ DynamicMethodTest::FruitMedley#banana
43
+ DynamicMethodTest::FruitMedley#orange
44
+ DynamicMethodTest::FruitMedley#apple
45
+ Integer#==
46
+ )
47
+
48
+ assert_equal expected_method_names.join("\n"), methods.map(&:full_name).join("\n")
49
+ end
50
+ end
@@ -1,21 +1,23 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- require File.expand_path('../test_helper', __FILE__)
5
-
6
- # -- Test for bug
7
- # http://github.com/rdp/ruby-prof/issues#issue/12
8
-
9
- class EnumerableTest < TestCase
10
- def test_enumerable
11
- result = RubyProf::Profile.profile do
12
- 3.times { [1,2,3].any? {|n| n} }
13
- end
14
- methods = if RUBY_VERSION >= "3.3.0"
15
- %w(EnumerableTest#test_enumerable Integer#times Kernel#block_given? Integer#< Array#any? Integer#succ)
16
- else
17
- %w(EnumerableTest#test_enumerable Integer#times Array#any?)
18
- end
19
- assert_equal(methods, result.threads.first.methods.map(&:full_name))
20
- end
21
- end
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+
6
+ # -- Test for bug
7
+ # http://github.com/rdp/ruby-prof/issues#issue/12
8
+
9
+ class EnumerableTest < TestCase
10
+ def test_enumerable
11
+ result = RubyProf::Profile.profile do
12
+ 3.times { [1,2,3].any? {|n| n} }
13
+ end
14
+ methods = if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.3')
15
+ %w(EnumerableTest#test_enumerable Integer#times Array#any?)
16
+ elsif Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.4')
17
+ %w(EnumerableTest#test_enumerable Integer#times Kernel#block_given? Integer#< Array#any? Integer#succ)
18
+ else
19
+ %w(EnumerableTest#test_enumerable Integer#times Integer#< Array#any? Integer#succ)
20
+ end
21
+ assert_equal(methods, result.threads.first.methods.map(&:full_name))
22
+ end
23
+ end