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,82 +1,82 @@
1
- # frozen_string_literal: true
2
-
3
- require File.expand_path('../test_helper', __FILE__)
4
-
5
- class MeasurementTest < Minitest::Test
6
- def test_initialize
7
- measurement = RubyProf::Measurement.new(3.3, 2.2, 1.1, 4)
8
- assert_equal(3.3, measurement.total_time)
9
- assert_equal(2.2, measurement.self_time)
10
- assert_equal(1.1, measurement.wait_time)
11
- assert_equal(4, measurement.called)
12
- end
13
-
14
- def test_clone
15
- measurement_1 = RubyProf::Measurement.new(3.3, 2.2, 1.1, 4)
16
- measurement_2 = measurement_1.clone
17
-
18
- refute(measurement_1.equal?(measurement_2))
19
- refute(measurement_1.eql?(measurement_2))
20
- refute(measurement_1 == measurement_2)
21
-
22
- assert_equal(measurement_1.total_time, measurement_2.total_time)
23
- assert_equal(measurement_1.self_time, measurement_2.self_time)
24
- assert_equal(measurement_1.wait_time, measurement_2.wait_time)
25
- assert_equal(measurement_1.called, measurement_2.called)
26
- end
27
-
28
- def test_dup
29
- measurement_1 = RubyProf::Measurement.new(3.3, 2.2, 1.1, 4)
30
- measurement_2 = measurement_1.dup
31
-
32
- refute(measurement_1.equal?(measurement_2))
33
- refute(measurement_1.eql?(measurement_2))
34
- refute(measurement_1 == measurement_2)
35
-
36
- assert_equal(measurement_1.total_time, measurement_2.total_time)
37
- assert_equal(measurement_1.self_time, measurement_2.self_time)
38
- assert_equal(measurement_1.wait_time, measurement_2.wait_time)
39
- assert_equal(measurement_1.called, measurement_2.called)
40
- end
41
-
42
- def test_merge!
43
- measurement1 = RubyProf::Measurement.new(3.3, 2.2, 1.1, 4)
44
- measurement2 = RubyProf::Measurement.new(3, 2, 1, 3)
45
-
46
- measurement1.merge!(measurement2)
47
-
48
- assert_equal(6.3, measurement1.total_time)
49
- assert_equal(4.2, measurement1.self_time)
50
- assert_equal(2.1, measurement1.wait_time)
51
- assert_equal(7, measurement1.called)
52
-
53
- assert_equal(3, measurement2.total_time)
54
- assert_equal(2, measurement2.self_time)
55
- assert_equal(1, measurement2.wait_time)
56
- assert_equal(3, measurement2.called)
57
- end
58
-
59
- def test_set_total_time
60
- measurement = RubyProf::Measurement.new(4, 3, 1, 1)
61
- measurement.total_time = 5.1
62
- assert_equal(5.1, measurement.total_time)
63
- end
64
-
65
- def test_set_self_time
66
- measurement = RubyProf::Measurement.new(4, 3, 1, 1)
67
- measurement.self_time = 3.1
68
- assert_equal(3.1, measurement.self_time)
69
- end
70
-
71
- def test_set_wait_time
72
- measurement = RubyProf::Measurement.new(4, 3, 1, 1)
73
- measurement.wait_time = 1.1
74
- assert_equal(1.1, measurement.wait_time)
75
- end
76
-
77
- def test_set_called
78
- measurement = RubyProf::Measurement.new(4, 3, 1, 1)
79
- measurement.called = 2
80
- assert_equal(2, measurement.called)
81
- end
82
- end
1
+ # frozen_string_literal: true
2
+
3
+ require File.expand_path('../test_helper', __FILE__)
4
+
5
+ class MeasurementTest < Minitest::Test
6
+ def test_initialize
7
+ measurement = RubyProf::Measurement.new(3.3, 2.2, 1.1, 4)
8
+ assert_equal(3.3, measurement.total_time)
9
+ assert_equal(2.2, measurement.self_time)
10
+ assert_equal(1.1, measurement.wait_time)
11
+ assert_equal(4, measurement.called)
12
+ end
13
+
14
+ def test_clone
15
+ measurement_1 = RubyProf::Measurement.new(3.3, 2.2, 1.1, 4)
16
+ measurement_2 = measurement_1.clone
17
+
18
+ refute(measurement_1.equal?(measurement_2))
19
+ refute(measurement_1.eql?(measurement_2))
20
+ refute(measurement_1 == measurement_2)
21
+
22
+ assert_equal(measurement_1.total_time, measurement_2.total_time)
23
+ assert_equal(measurement_1.self_time, measurement_2.self_time)
24
+ assert_equal(measurement_1.wait_time, measurement_2.wait_time)
25
+ assert_equal(measurement_1.called, measurement_2.called)
26
+ end
27
+
28
+ def test_dup
29
+ measurement_1 = RubyProf::Measurement.new(3.3, 2.2, 1.1, 4)
30
+ measurement_2 = measurement_1.dup
31
+
32
+ refute(measurement_1.equal?(measurement_2))
33
+ refute(measurement_1.eql?(measurement_2))
34
+ refute(measurement_1 == measurement_2)
35
+
36
+ assert_equal(measurement_1.total_time, measurement_2.total_time)
37
+ assert_equal(measurement_1.self_time, measurement_2.self_time)
38
+ assert_equal(measurement_1.wait_time, measurement_2.wait_time)
39
+ assert_equal(measurement_1.called, measurement_2.called)
40
+ end
41
+
42
+ def test_merge!
43
+ measurement1 = RubyProf::Measurement.new(3.3, 2.2, 1.1, 4)
44
+ measurement2 = RubyProf::Measurement.new(3, 2, 1, 3)
45
+
46
+ measurement1.merge!(measurement2)
47
+
48
+ assert_equal(6.3, measurement1.total_time)
49
+ assert_equal(4.2, measurement1.self_time)
50
+ assert_equal(2.1, measurement1.wait_time)
51
+ assert_equal(7, measurement1.called)
52
+
53
+ assert_equal(3, measurement2.total_time)
54
+ assert_equal(2, measurement2.self_time)
55
+ assert_equal(1, measurement2.wait_time)
56
+ assert_equal(3, measurement2.called)
57
+ end
58
+
59
+ def test_set_total_time
60
+ measurement = RubyProf::Measurement.new(4, 3, 1, 1)
61
+ measurement.total_time = 5.1
62
+ assert_equal(5.1, measurement.total_time)
63
+ end
64
+
65
+ def test_set_self_time
66
+ measurement = RubyProf::Measurement.new(4, 3, 1, 1)
67
+ measurement.self_time = 3.1
68
+ assert_equal(3.1, measurement.self_time)
69
+ end
70
+
71
+ def test_set_wait_time
72
+ measurement = RubyProf::Measurement.new(4, 3, 1, 1)
73
+ measurement.wait_time = 1.1
74
+ assert_equal(1.1, measurement.wait_time)
75
+ end
76
+
77
+ def test_set_called
78
+ measurement = RubyProf::Measurement.new(4, 3, 1, 1)
79
+ measurement.called = 2
80
+ assert_equal(2, measurement.called)
81
+ end
82
+ end
data/test/merge_test.rb CHANGED
@@ -1,146 +1,146 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- require File.expand_path('../test_helper', __FILE__)
5
-
6
- if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3.1.0')
7
-
8
- require_relative './scheduler'
9
-
10
- # -- Tests ----
11
- class MergeTest < TestCase
12
- def worker1
13
- sleep(0.5)
14
- end
15
-
16
- def worker2
17
- sleep(0.5)
18
- sleep(0.5)
19
- end
20
-
21
- def worker3
22
- sleep(0.5)
23
- end
24
-
25
- def concurrency_single_worker
26
- scheduler = Scheduler.new
27
- Fiber.set_scheduler(scheduler)
28
-
29
- 3.times do
30
- Fiber.schedule do
31
- worker1
32
- end
33
- end
34
- Fiber.scheduler.close
35
- end
36
-
37
- def concurrency_multiple_workers
38
- scheduler = Scheduler.new
39
- Fiber.set_scheduler(scheduler)
40
-
41
- 3.times do |i|
42
- Fiber.schedule do
43
- method = "worker#{i + 1}".to_sym
44
- send(method)
45
- end
46
- end
47
- Fiber.scheduler.close
48
- end
49
-
50
- def test_single_worker_unmerged
51
- result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) { concurrency_single_worker }
52
- assert_equal(4, result.threads.size)
53
-
54
- thread = result.threads[0]
55
- assert_in_delta(0.5, thread.call_tree.target.total_time, 0.1)
56
- assert_in_delta(0.0, thread.call_tree.target.self_time, 0.1)
57
- assert_in_delta(0.0, thread.call_tree.target.wait_time, 0.1)
58
- assert_in_delta(0.5, thread.call_tree.target.children_time, 0.1)
59
-
60
- thread = result.threads[1]
61
- assert_in_delta(0.5, thread.call_tree.target.total_time, 0.1)
62
- assert_in_delta(0.0, thread.call_tree.target.self_time, 0.1)
63
- assert_in_delta(0.0, thread.call_tree.target.wait_time, 0.1)
64
- assert_in_delta(0.5, thread.call_tree.target.children_time, 0.1)
65
-
66
- thread = result.threads[2]
67
- assert_in_delta(0.5, thread.call_tree.target.total_time, 0.1)
68
- assert_in_delta(0.0, thread.call_tree.target.self_time, 0.1)
69
- assert_in_delta(0.0, thread.call_tree.target.wait_time, 0.1)
70
- assert_in_delta(0.5, thread.call_tree.target.children_time, 0.1)
71
-
72
- thread = result.threads[3]
73
- assert_in_delta(0.5, thread.call_tree.target.total_time, 0.1)
74
- assert_in_delta(0.0, thread.call_tree.target.self_time, 0.1)
75
- assert_in_delta(0.0, thread.call_tree.target.wait_time, 0.1)
76
- assert_in_delta(0.5, thread.call_tree.target.children_time, 0.1)
77
- end
78
-
79
- def test_single_worker_merged
80
- result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) { concurrency_single_worker }
81
- result.merge!
82
-
83
- assert_equal(2, result.threads.size)
84
-
85
- thread = result.threads[0]
86
- assert_in_delta(0.5, thread.call_tree.target.total_time, 0.1)
87
- assert_in_delta(0.0, thread.call_tree.target.self_time, 0.1)
88
- assert_in_delta(0.0, thread.call_tree.target.wait_time, 0.1)
89
- assert_in_delta(0.5, thread.call_tree.target.children_time, 0.1)
90
-
91
- thread = result.threads[1]
92
- assert_in_delta(1.5, thread.call_tree.target.total_time, 0.1)
93
- assert_in_delta(0.0, thread.call_tree.target.self_time, 0.1)
94
- assert_in_delta(0.0, thread.call_tree.target.wait_time, 0.1)
95
- assert_in_delta(1.5, thread.call_tree.target.children_time, 0.1)
96
- end
97
-
98
- def test_multiple_workers_unmerged
99
- result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) { concurrency_multiple_workers }
100
- assert_equal(4, result.threads.count)
101
-
102
- thread = result.threads[0]
103
- assert_in_delta(1.0, thread.call_tree.target.total_time, 0.1)
104
- assert_in_delta(0.0, thread.call_tree.target.self_time, 0.1)
105
- assert_in_delta(0.0, thread.call_tree.target.wait_time, 0.1)
106
- assert_in_delta(1.0, thread.call_tree.target.children_time, 0.1)
107
-
108
- thread = result.threads[1]
109
- assert_in_delta(1.0, thread.call_tree.target.total_time, 0.1)
110
- assert_in_delta(0.0, thread.call_tree.target.self_time, 0.1)
111
- assert_in_delta(0.5, thread.call_tree.target.wait_time, 0.1)
112
- assert_in_delta(0.5, thread.call_tree.target.children_time, 0.1)
113
-
114
- thread = result.threads[2]
115
- assert_in_delta(1.0, thread.call_tree.target.total_time, 0.1)
116
- assert_in_delta(0.0, thread.call_tree.target.self_time, 0.1)
117
- assert_in_delta(0.0, thread.call_tree.target.wait_time, 0.1)
118
- assert_in_delta(1.0, thread.call_tree.target.children_time, 0.1)
119
-
120
- thread = result.threads[3]
121
- assert_in_delta(1.0, thread.call_tree.target.total_time, 0.1)
122
- assert_in_delta(0.0, thread.call_tree.target.self_time, 0.1)
123
- assert_in_delta(0.5, thread.call_tree.target.wait_time, 0.1)
124
- assert_in_delta(0.5, thread.call_tree.target.children_time, 0.1)
125
- end
126
-
127
- def test_multiple_workers_merged
128
- result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) { concurrency_multiple_workers }
129
- result.merge!
130
-
131
- assert_equal(2, result.threads.count)
132
-
133
- thread = result.threads[0]
134
- assert_in_delta(1.0, thread.call_tree.target.total_time, 0.1)
135
- assert_in_delta(0.0, thread.call_tree.target.self_time, 0.1)
136
- assert_in_delta(0.0, thread.call_tree.target.wait_time, 0.1)
137
- assert_in_delta(1.0, thread.call_tree.target.children_time, 0.1)
138
-
139
- thread = result.threads[1]
140
- assert_in_delta(3.0, thread.call_tree.target.total_time, 0.1)
141
- assert_in_delta(0.0, thread.call_tree.target.self_time, 0.1)
142
- assert_in_delta(1.0, thread.call_tree.target.wait_time, 0.1)
143
- assert_in_delta(2.0, thread.call_tree.target.children_time, 0.1)
144
- end
145
- end
146
- end
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+
6
+ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3.1.0')
7
+
8
+ require_relative './scheduler'
9
+
10
+ # -- Tests ----
11
+ class MergeTest < TestCase
12
+ def worker1
13
+ sleep(0.5)
14
+ end
15
+
16
+ def worker2
17
+ sleep(0.5)
18
+ sleep(0.5)
19
+ end
20
+
21
+ def worker3
22
+ sleep(0.5)
23
+ end
24
+
25
+ def concurrency_single_worker
26
+ scheduler = Scheduler.new
27
+ Fiber.set_scheduler(scheduler)
28
+
29
+ 3.times do
30
+ Fiber.schedule do
31
+ worker1
32
+ end
33
+ end
34
+ Fiber.scheduler.close
35
+ end
36
+
37
+ def concurrency_multiple_workers
38
+ scheduler = Scheduler.new
39
+ Fiber.set_scheduler(scheduler)
40
+
41
+ 3.times do |i|
42
+ Fiber.schedule do
43
+ method = "worker#{i + 1}".to_sym
44
+ send(method)
45
+ end
46
+ end
47
+ Fiber.scheduler.close
48
+ end
49
+
50
+ def test_single_worker_unmerged
51
+ result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) { concurrency_single_worker }
52
+ assert_equal(4, result.threads.size)
53
+
54
+ thread = result.threads[0]
55
+ assert_in_delta(0.5, thread.call_tree.target.total_time, 0.1 * delta_multiplier)
56
+ assert_in_delta(0.0, thread.call_tree.target.self_time, 0.1 * delta_multiplier)
57
+ assert_in_delta(0.0, thread.call_tree.target.wait_time, 0.1 * delta_multiplier)
58
+ assert_in_delta(0.5, thread.call_tree.target.children_time, 0.1 * delta_multiplier)
59
+
60
+ thread = result.threads[1]
61
+ assert_in_delta(0.5, thread.call_tree.target.total_time, 0.1 * delta_multiplier)
62
+ assert_in_delta(0.0, thread.call_tree.target.self_time, 0.1 * delta_multiplier)
63
+ assert_in_delta(0.0, thread.call_tree.target.wait_time, 0.1 * delta_multiplier)
64
+ assert_in_delta(0.5, thread.call_tree.target.children_time, 0.1 * delta_multiplier)
65
+
66
+ thread = result.threads[2]
67
+ assert_in_delta(0.5, thread.call_tree.target.total_time, 0.1 * delta_multiplier)
68
+ assert_in_delta(0.0, thread.call_tree.target.self_time, 0.1 * delta_multiplier)
69
+ assert_in_delta(0.0, thread.call_tree.target.wait_time, 0.1 * delta_multiplier)
70
+ assert_in_delta(0.5, thread.call_tree.target.children_time, 0.1 * delta_multiplier)
71
+
72
+ thread = result.threads[3]
73
+ assert_in_delta(0.5, thread.call_tree.target.total_time, 0.1 * delta_multiplier)
74
+ assert_in_delta(0.0, thread.call_tree.target.self_time, 0.1 * delta_multiplier)
75
+ assert_in_delta(0.0, thread.call_tree.target.wait_time, 0.1 * delta_multiplier)
76
+ assert_in_delta(0.5, thread.call_tree.target.children_time, 0.1 * delta_multiplier)
77
+ end
78
+
79
+ def test_single_worker_merged
80
+ result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) { concurrency_single_worker }
81
+ result.merge!
82
+
83
+ assert_equal(2, result.threads.size)
84
+
85
+ thread = result.threads[0]
86
+ assert_in_delta(0.5, thread.call_tree.target.total_time, 0.1 * delta_multiplier)
87
+ assert_in_delta(0.0, thread.call_tree.target.self_time, 0.1 * delta_multiplier)
88
+ assert_in_delta(0.0, thread.call_tree.target.wait_time, 0.1 * delta_multiplier)
89
+ assert_in_delta(0.5, thread.call_tree.target.children_time, 0.1 * delta_multiplier)
90
+
91
+ thread = result.threads[1]
92
+ assert_in_delta(1.5, thread.call_tree.target.total_time, 0.1 * delta_multiplier)
93
+ assert_in_delta(0.0, thread.call_tree.target.self_time, 0.1 * delta_multiplier)
94
+ assert_in_delta(0.0, thread.call_tree.target.wait_time, 0.1 * delta_multiplier)
95
+ assert_in_delta(1.5, thread.call_tree.target.children_time, 0.1 * delta_multiplier)
96
+ end
97
+
98
+ def test_multiple_workers_unmerged
99
+ result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) { concurrency_multiple_workers }
100
+ assert_equal(4, result.threads.count)
101
+
102
+ thread = result.threads[0]
103
+ assert_in_delta(1.0, thread.call_tree.target.total_time, 0.1 * delta_multiplier)
104
+ assert_in_delta(0.0, thread.call_tree.target.self_time, 0.1 * delta_multiplier)
105
+ assert_in_delta(0.0, thread.call_tree.target.wait_time, 0.1 * delta_multiplier)
106
+ assert_in_delta(1.0, thread.call_tree.target.children_time, 0.1 * delta_multiplier)
107
+
108
+ thread = result.threads[1]
109
+ assert_in_delta(1.0, thread.call_tree.target.total_time, 0.1 * delta_multiplier)
110
+ assert_in_delta(0.0, thread.call_tree.target.self_time, 0.1 * delta_multiplier)
111
+ assert_in_delta(0.5, thread.call_tree.target.wait_time, 0.1 * delta_multiplier)
112
+ assert_in_delta(0.5, thread.call_tree.target.children_time, 0.1 * delta_multiplier)
113
+
114
+ thread = result.threads[2]
115
+ assert_in_delta(1.0, thread.call_tree.target.total_time, 0.1 * delta_multiplier)
116
+ assert_in_delta(0.0, thread.call_tree.target.self_time, 0.1 * delta_multiplier)
117
+ assert_in_delta(0.0, thread.call_tree.target.wait_time, 0.1 * delta_multiplier)
118
+ assert_in_delta(1.0, thread.call_tree.target.children_time, 0.1 * delta_multiplier)
119
+
120
+ thread = result.threads[3]
121
+ assert_in_delta(1.0, thread.call_tree.target.total_time, 0.1 * delta_multiplier)
122
+ assert_in_delta(0.0, thread.call_tree.target.self_time, 0.1 * delta_multiplier)
123
+ assert_in_delta(0.5, thread.call_tree.target.wait_time, 0.1 * delta_multiplier)
124
+ assert_in_delta(0.5, thread.call_tree.target.children_time, 0.1 * delta_multiplier)
125
+ end
126
+
127
+ def test_multiple_workers_merged
128
+ result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) { concurrency_multiple_workers }
129
+ result.merge!
130
+
131
+ assert_equal(2, result.threads.count)
132
+
133
+ thread = result.threads[0]
134
+ assert_in_delta(1.0, thread.call_tree.target.total_time, 0.1 * delta_multiplier)
135
+ assert_in_delta(0.0, thread.call_tree.target.self_time, 0.1 * delta_multiplier)
136
+ assert_in_delta(0.0, thread.call_tree.target.wait_time, 0.1 * delta_multiplier)
137
+ assert_in_delta(1.0, thread.call_tree.target.children_time, 0.1 * delta_multiplier)
138
+
139
+ thread = result.threads[1]
140
+ assert_in_delta(3.0, thread.call_tree.target.total_time, 0.1 * delta_multiplier)
141
+ assert_in_delta(0.0, thread.call_tree.target.self_time, 0.1 * delta_multiplier)
142
+ assert_in_delta(1.0, thread.call_tree.target.wait_time, 0.1 * delta_multiplier)
143
+ assert_in_delta(2.0, thread.call_tree.target.children_time, 0.1 * delta_multiplier)
144
+ end
145
+ end
146
+ end
@@ -1,95 +1,100 @@
1
- # frozen_string_literal: true
2
-
3
- require File.expand_path('../test_helper', __FILE__)
4
- require 'base64'
5
-
6
- class MethodInfoTest < Minitest::Test
7
- def test_initialize
8
- method_info = RubyProf::MethodInfo.new(Base64, :encode64)
9
- assert_equal("Base64", method_info.klass_name)
10
- assert_equal(:encode64, method_info.method_name)
11
- assert_equal("Base64#encode64", method_info.full_name)
12
- assert_equal(0, method_info.klass_flags)
13
- assert_match(/base64\.rb/, method_info.source_file)
14
- assert_kind_of(Integer, method_info.line)
15
- refute(method_info.recursive?)
16
-
17
- assert_kind_of(RubyProf::Measurement, method_info.measurement)
18
- assert_kind_of(RubyProf::CallTrees, method_info.call_trees)
19
- assert_empty(method_info.allocations)
20
- end
21
-
22
- def test_initialize_nil_klass
23
- error = assert_raises(NoMethodError) do
24
- RubyProf::MethodInfo.new(nil, nil)
25
- end
26
- assert_match(/undefined method `instance_method' for nil/, error.message)
27
- end
28
-
29
- def test_initialize_nil_method_name
30
- error = assert_raises(TypeError) do
31
- RubyProf::MethodInfo.new(Base64, nil)
32
- end
33
- assert_equal("nil is not a symbol nor a string", error.to_s)
34
- end
35
-
36
- def test_initialize_unknown_location
37
- method_info = RubyProf::MethodInfo.new(Array, :size)
38
- assert_equal('Array', method_info.klass_name)
39
- assert_equal(:size, method_info.method_name)
40
- assert_nil(method_info.source_file)
41
- assert_equal(0, method_info.line)
42
- end
43
-
44
- def test_measurement
45
- method_info = RubyProf::MethodInfo.new(Base64, :encode64)
46
- assert_equal(0, method_info.total_time)
47
- assert_equal(0, method_info.self_time)
48
- assert_equal(0, method_info.wait_time)
49
- assert_equal(0, method_info.children_time)
50
- assert_equal(0, method_info.called)
51
- end
52
-
53
- def test_compare
54
- method_info_1 = RubyProf::MethodInfo.new(Base64, :encode64)
55
- method_info_2 = RubyProf::MethodInfo.new(Base64, :encode64)
56
- assert_equal(0, method_info_1 <=> method_info_2)
57
-
58
- method_info_1 = RubyProf::MethodInfo.new(Base64, :decode64)
59
- method_info_2 = RubyProf::MethodInfo.new(Base64, :encode64)
60
- assert_equal(-1, method_info_1 <=> method_info_2)
61
-
62
- method_info_1 = RubyProf::MethodInfo.new(Base64, :encode64)
63
- method_info_2 = RubyProf::MethodInfo.new(Base64, :decode64)
64
- assert_equal(1, method_info_1 <=> method_info_2)
65
- end
66
-
67
- def test_eql?
68
- method_info_1 = RubyProf::MethodInfo.new(Base64, :encode64)
69
- method_info_2 = RubyProf::MethodInfo.new(Base64, :encode64)
70
- assert(method_info_1.eql?(method_info_2))
71
- end
72
-
73
- def test_equal?
74
- method_info_1 = RubyProf::MethodInfo.new(Base64, :encode64)
75
- method_info_2 = RubyProf::MethodInfo.new(Base64, :encode64)
76
- refute(method_info_1.equal?(method_info_2))
77
- end
78
-
79
- def test_equality
80
- method_info_1 = RubyProf::MethodInfo.new(Base64, :encode64)
81
- method_info_2 = RubyProf::MethodInfo.new(Base64, :encode64)
82
- assert(method_info_1 == method_info_2)
83
- end
84
-
85
- def test_hash
86
- method_info_1 = RubyProf::MethodInfo.new(Base64, :encode64)
87
- method_info_2 = RubyProf::MethodInfo.new(Base64, :encode64)
88
- assert_equal(method_info_1.hash, method_info_2.hash)
89
- end
90
-
91
- def test_to_s
92
- method_info = RubyProf::MethodInfo.new(Base64, :encode64)
93
- assert_equal("Base64#encode64 (c: 0, tt: 0.0, st: 0.0, wt: 0.0, ct: 0.0)", method_info.to_s)
94
- end
95
- end
1
+ # frozen_string_literal: true
2
+
3
+ require File.expand_path('../test_helper', __FILE__)
4
+ require 'base64'
5
+
6
+ class MethodInfoTest < Minitest::Test
7
+ def test_initialize
8
+ method_info = RubyProf::MethodInfo.new(Base64, :encode64)
9
+ assert_equal("Base64", method_info.klass_name)
10
+ assert_equal(:encode64, method_info.method_name)
11
+ assert_equal("Base64#encode64", method_info.full_name)
12
+ assert_equal(0, method_info.klass_flags)
13
+ assert_match(/base64\.rb/, method_info.source_file)
14
+ assert_kind_of(Integer, method_info.line)
15
+ refute(method_info.recursive?)
16
+
17
+ assert_kind_of(RubyProf::Measurement, method_info.measurement)
18
+ assert_kind_of(RubyProf::CallTrees, method_info.call_trees)
19
+ assert_empty(method_info.allocations)
20
+ end
21
+
22
+ def test_initialize_nil_klass
23
+ error = assert_raises(NoMethodError) do
24
+ RubyProf::MethodInfo.new(nil, nil)
25
+ end
26
+
27
+ if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.4')
28
+ assert_match(/undefined method `instance_method' for nil/, error.message)
29
+ else
30
+ assert_match(/undefined method 'instance_method' for nil/, error.message)
31
+ end
32
+ end
33
+
34
+ def test_initialize_nil_method_name
35
+ error = assert_raises(TypeError) do
36
+ RubyProf::MethodInfo.new(Base64, nil)
37
+ end
38
+ assert_equal("nil is not a symbol nor a string", error.to_s)
39
+ end
40
+
41
+ def test_initialize_unknown_location
42
+ method_info = RubyProf::MethodInfo.new(Array, :size)
43
+ assert_equal('Array', method_info.klass_name)
44
+ assert_equal(:size, method_info.method_name)
45
+ assert_nil(method_info.source_file)
46
+ assert_equal(0, method_info.line)
47
+ end
48
+
49
+ def test_measurement
50
+ method_info = RubyProf::MethodInfo.new(Base64, :encode64)
51
+ assert_equal(0, method_info.total_time)
52
+ assert_equal(0, method_info.self_time)
53
+ assert_equal(0, method_info.wait_time)
54
+ assert_equal(0, method_info.children_time)
55
+ assert_equal(0, method_info.called)
56
+ end
57
+
58
+ def test_compare
59
+ method_info_1 = RubyProf::MethodInfo.new(Base64, :encode64)
60
+ method_info_2 = RubyProf::MethodInfo.new(Base64, :encode64)
61
+ assert_equal(0, method_info_1 <=> method_info_2)
62
+
63
+ method_info_1 = RubyProf::MethodInfo.new(Base64, :decode64)
64
+ method_info_2 = RubyProf::MethodInfo.new(Base64, :encode64)
65
+ assert_equal(-1, method_info_1 <=> method_info_2)
66
+
67
+ method_info_1 = RubyProf::MethodInfo.new(Base64, :encode64)
68
+ method_info_2 = RubyProf::MethodInfo.new(Base64, :decode64)
69
+ assert_equal(1, method_info_1 <=> method_info_2)
70
+ end
71
+
72
+ def test_eql?
73
+ method_info_1 = RubyProf::MethodInfo.new(Base64, :encode64)
74
+ method_info_2 = RubyProf::MethodInfo.new(Base64, :encode64)
75
+ assert(method_info_1.eql?(method_info_2))
76
+ end
77
+
78
+ def test_equal?
79
+ method_info_1 = RubyProf::MethodInfo.new(Base64, :encode64)
80
+ method_info_2 = RubyProf::MethodInfo.new(Base64, :encode64)
81
+ refute(method_info_1.equal?(method_info_2))
82
+ end
83
+
84
+ def test_equality
85
+ method_info_1 = RubyProf::MethodInfo.new(Base64, :encode64)
86
+ method_info_2 = RubyProf::MethodInfo.new(Base64, :encode64)
87
+ assert(method_info_1 == method_info_2)
88
+ end
89
+
90
+ def test_hash
91
+ method_info_1 = RubyProf::MethodInfo.new(Base64, :encode64)
92
+ method_info_2 = RubyProf::MethodInfo.new(Base64, :encode64)
93
+ assert_equal(method_info_1.hash, method_info_2.hash)
94
+ end
95
+
96
+ def test_to_s
97
+ method_info = RubyProf::MethodInfo.new(Base64, :encode64)
98
+ assert_equal("Base64#encode64 (c: 0, tt: 0.0, st: 0.0, wt: 0.0, ct: 0.0)", method_info.to_s)
99
+ end
100
+ end