ruby-prof 0.17.0 → 0.18.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.
- checksums.yaml +5 -5
- data/CHANGES +500 -482
- data/LICENSE +24 -24
- data/README.rdoc +487 -485
- data/Rakefile +113 -113
- data/bin/ruby-prof +345 -345
- data/bin/ruby-prof-check-trace +45 -45
- data/examples/flat.txt +50 -50
- data/examples/graph.dot +84 -84
- data/examples/graph.html +823 -823
- data/examples/graph.txt +139 -139
- data/examples/multi.flat.txt +23 -23
- data/examples/multi.graph.html +760 -760
- data/examples/multi.grind.dat +114 -114
- data/examples/multi.stack.html +547 -547
- data/examples/stack.html +547 -547
- data/ext/ruby_prof/extconf.rb +68 -68
- data/ext/ruby_prof/rp_call_info.c +425 -425
- data/ext/ruby_prof/rp_call_info.h +53 -53
- data/ext/ruby_prof/rp_measure.c +40 -40
- data/ext/ruby_prof/rp_measure.h +45 -45
- data/ext/ruby_prof/rp_measure_allocations.c +76 -76
- data/ext/ruby_prof/rp_measure_cpu_time.c +136 -136
- data/ext/ruby_prof/rp_measure_gc_runs.c +73 -73
- data/ext/ruby_prof/rp_measure_gc_time.c +60 -60
- data/ext/ruby_prof/rp_measure_memory.c +77 -77
- data/ext/ruby_prof/rp_measure_process_time.c +71 -71
- data/ext/ruby_prof/rp_measure_wall_time.c +45 -45
- data/ext/ruby_prof/rp_method.c +630 -636
- data/ext/ruby_prof/rp_method.h +75 -75
- data/ext/ruby_prof/rp_stack.c +173 -173
- data/ext/ruby_prof/rp_stack.h +63 -63
- data/ext/ruby_prof/rp_thread.c +277 -276
- data/ext/ruby_prof/rp_thread.h +27 -27
- data/ext/ruby_prof/ruby_prof.c +794 -774
- data/ext/ruby_prof/ruby_prof.h +60 -59
- data/ext/ruby_prof/vc/ruby_prof.sln +20 -21
- data/ext/ruby_prof/vc/{ruby_prof_20.vcxproj → ruby_prof.vcxproj} +31 -0
- data/lib/ruby-prof.rb +68 -68
- data/lib/ruby-prof/aggregate_call_info.rb +76 -76
- data/lib/ruby-prof/assets/call_stack_printer.css.html +116 -116
- data/lib/ruby-prof/assets/call_stack_printer.js.html +384 -384
- data/lib/ruby-prof/call_info.rb +115 -115
- data/lib/ruby-prof/call_info_visitor.rb +40 -40
- data/lib/ruby-prof/compatibility.rb +179 -178
- data/lib/ruby-prof/method_info.rb +121 -121
- data/lib/ruby-prof/printers/abstract_printer.rb +104 -103
- data/lib/ruby-prof/printers/call_info_printer.rb +41 -41
- data/lib/ruby-prof/printers/call_stack_printer.rb +265 -265
- data/lib/ruby-prof/printers/call_tree_printer.rb +143 -143
- data/lib/ruby-prof/printers/dot_printer.rb +132 -132
- data/lib/ruby-prof/printers/flat_printer.rb +70 -70
- data/lib/ruby-prof/printers/flat_printer_with_line_numbers.rb +83 -83
- data/lib/ruby-prof/printers/graph_html_printer.rb +249 -249
- data/lib/ruby-prof/printers/graph_printer.rb +116 -116
- data/lib/ruby-prof/printers/multi_printer.rb +84 -84
- data/lib/ruby-prof/profile.rb +26 -26
- data/lib/ruby-prof/profile/exclude_common_methods.rb +207 -201
- data/lib/ruby-prof/profile/legacy_method_elimination.rb +50 -49
- data/lib/ruby-prof/rack.rb +174 -174
- data/lib/ruby-prof/task.rb +147 -147
- data/lib/ruby-prof/thread.rb +35 -35
- data/lib/ruby-prof/version.rb +3 -3
- data/lib/unprof.rb +10 -10
- data/ruby-prof.gemspec +58 -58
- data/test/abstract_printer_test.rb +53 -0
- data/test/aggregate_test.rb +136 -136
- data/test/basic_test.rb +128 -128
- data/test/block_test.rb +74 -74
- data/test/call_info_test.rb +78 -78
- data/test/call_info_visitor_test.rb +31 -31
- data/test/duplicate_names_test.rb +32 -32
- data/test/dynamic_method_test.rb +55 -55
- data/test/enumerable_test.rb +21 -21
- data/test/exceptions_test.rb +24 -16
- data/test/exclude_methods_test.rb +146 -146
- data/test/exclude_threads_test.rb +53 -53
- data/test/fiber_test.rb +79 -79
- data/test/issue137_test.rb +63 -63
- data/test/line_number_test.rb +80 -80
- data/test/measure_allocations_test.rb +26 -26
- data/test/measure_cpu_time_test.rb +212 -213
- data/test/measure_gc_runs_test.rb +32 -32
- data/test/measure_gc_time_test.rb +36 -36
- data/test/measure_memory_test.rb +33 -33
- data/test/measure_process_time_test.rb +61 -63
- data/test/measure_wall_time_test.rb +255 -255
- data/test/method_elimination_test.rb +84 -84
- data/test/module_test.rb +45 -45
- data/test/multi_printer_test.rb +104 -104
- data/test/no_method_class_test.rb +15 -15
- data/test/pause_resume_test.rb +166 -166
- data/test/prime.rb +54 -54
- data/test/printers_test.rb +275 -275
- data/test/printing_recursive_graph_test.rb +127 -127
- data/test/rack_test.rb +157 -157
- data/test/recursive_test.rb +215 -215
- data/test/singleton_test.rb +38 -38
- data/test/stack_printer_test.rb +77 -78
- data/test/stack_test.rb +138 -138
- data/test/start_stop_test.rb +112 -112
- data/test/test_helper.rb +267 -275
- data/test/thread_test.rb +187 -187
- data/test/unique_call_path_test.rb +202 -202
- data/test/yarv_test.rb +55 -55
- metadata +17 -96
- data/doc/LICENSE.html +0 -115
- data/doc/README_rdoc.html +0 -637
- data/doc/Rack.html +0 -96
- data/doc/Rack/RubyProf.html +0 -233
- data/doc/Rack/RubyProf/RackProfiler.html +0 -343
- data/doc/RubyProf.html +0 -974
- data/doc/RubyProf/AbstractPrinter.html +0 -625
- data/doc/RubyProf/AggregateCallInfo.html +0 -552
- data/doc/RubyProf/CallInfo.html +0 -579
- data/doc/RubyProf/CallInfoPrinter.html +0 -121
- data/doc/RubyProf/CallInfoVisitor.html +0 -199
- data/doc/RubyProf/CallStackPrinter.html +0 -1127
- data/doc/RubyProf/CallTreePrinter.html +0 -725
- data/doc/RubyProf/Cmd.html +0 -637
- data/doc/RubyProf/DeprecationWarnings.html +0 -148
- data/doc/RubyProf/DotPrinter.html +0 -258
- data/doc/RubyProf/FlatPrinter.html +0 -164
- data/doc/RubyProf/FlatPrinterWithLineNumbers.html +0 -210
- data/doc/RubyProf/GraphHtmlPrinter.html +0 -558
- data/doc/RubyProf/GraphPrinter.html +0 -140
- data/doc/RubyProf/MethodInfo.html +0 -676
- data/doc/RubyProf/MultiPrinter.html +0 -574
- data/doc/RubyProf/Profile.html +0 -908
- data/doc/RubyProf/Profile/ExcludeCommonMethods.html +0 -411
- data/doc/RubyProf/Profile/LegacyMethodElimination.html +0 -158
- data/doc/RubyProf/ProfileTask.html +0 -491
- data/doc/RubyProf/Thread.html +0 -275
- data/doc/created.rid +0 -33
- data/doc/css/fonts.css +0 -167
- data/doc/css/rdoc.css +0 -590
- data/doc/examples/flat_txt.html +0 -139
- data/doc/examples/graph_html.html +0 -910
- data/doc/examples/graph_txt.html +0 -248
- data/doc/fonts/Lato-Light.ttf +0 -0
- data/doc/fonts/Lato-LightItalic.ttf +0 -0
- data/doc/fonts/Lato-Regular.ttf +0 -0
- data/doc/fonts/Lato-RegularItalic.ttf +0 -0
- data/doc/fonts/SourceCodePro-Bold.ttf +0 -0
- data/doc/fonts/SourceCodePro-Regular.ttf +0 -0
- data/doc/images/add.png +0 -0
- data/doc/images/arrow_up.png +0 -0
- data/doc/images/brick.png +0 -0
- data/doc/images/brick_link.png +0 -0
- data/doc/images/bug.png +0 -0
- data/doc/images/bullet_black.png +0 -0
- data/doc/images/bullet_toggle_minus.png +0 -0
- data/doc/images/bullet_toggle_plus.png +0 -0
- data/doc/images/date.png +0 -0
- data/doc/images/delete.png +0 -0
- data/doc/images/find.png +0 -0
- data/doc/images/loadingAnimation.gif +0 -0
- data/doc/images/macFFBgHack.png +0 -0
- data/doc/images/package.png +0 -0
- data/doc/images/page_green.png +0 -0
- data/doc/images/page_white_text.png +0 -0
- data/doc/images/page_white_width.png +0 -0
- data/doc/images/plugin.png +0 -0
- data/doc/images/ruby.png +0 -0
- data/doc/images/tag_blue.png +0 -0
- data/doc/images/tag_green.png +0 -0
- data/doc/images/transparent.png +0 -0
- data/doc/images/wrench.png +0 -0
- data/doc/images/wrench_orange.png +0 -0
- data/doc/images/zoom.png +0 -0
- data/doc/index.html +0 -666
- data/doc/js/darkfish.js +0 -161
- data/doc/js/jquery.js +0 -4
- data/doc/js/navigation.js +0 -142
- data/doc/js/navigation.js.gz +0 -0
- data/doc/js/search.js +0 -109
- data/doc/js/search_index.js +0 -1
- data/doc/js/search_index.js.gz +0 -0
- data/doc/js/searcher.js +0 -229
- data/doc/js/searcher.js.gz +0 -0
- data/doc/table_of_contents.html +0 -1052
- data/examples/cachegrind.out.1 +0 -114
- data/examples/cachegrind.out.1.32313213 +0 -114
- data/ext/ruby_prof/vc/ruby_prof_18.vcxproj +0 -108
- data/ext/ruby_prof/vc/ruby_prof_19.vcxproj +0 -110
@@ -1,31 +1,31 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# encoding: UTF-8
|
3
|
-
|
4
|
-
require File.expand_path('../test_helper', __FILE__)
|
5
|
-
|
6
|
-
class CallInfoVisitorTest < TestCase
|
7
|
-
def setup
|
8
|
-
# Need to use wall time for this test due to the sleep calls
|
9
|
-
RubyProf::measure_mode = RubyProf::WALL_TIME
|
10
|
-
end
|
11
|
-
|
12
|
-
def test_visit
|
13
|
-
result = RubyProf.profile do
|
14
|
-
RubyProf::C1.hello
|
15
|
-
end
|
16
|
-
|
17
|
-
visitor = RubyProf::CallInfoVisitor.new(result.threads.first.top_call_infos)
|
18
|
-
|
19
|
-
method_names = Array.new
|
20
|
-
|
21
|
-
visitor.visit do |call_info, event|
|
22
|
-
method_names << call_info.target.full_name if event == :enter
|
23
|
-
end
|
24
|
-
|
25
|
-
assert_equal(3, method_names.length)
|
26
|
-
assert_equal("CallInfoVisitorTest#test_visit", method_names[0])
|
27
|
-
assert_equal("<Class::RubyProf::C1>#hello", method_names[1])
|
28
|
-
assert_equal("Kernel#sleep", method_names[2])
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
require File.expand_path('../test_helper', __FILE__)
|
5
|
+
|
6
|
+
class CallInfoVisitorTest < TestCase
|
7
|
+
def setup
|
8
|
+
# Need to use wall time for this test due to the sleep calls
|
9
|
+
RubyProf::measure_mode = RubyProf::WALL_TIME
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_visit
|
13
|
+
result = RubyProf.profile do
|
14
|
+
RubyProf::C1.hello
|
15
|
+
end
|
16
|
+
|
17
|
+
visitor = RubyProf::CallInfoVisitor.new(result.threads.first.top_call_infos)
|
18
|
+
|
19
|
+
method_names = Array.new
|
20
|
+
|
21
|
+
visitor.visit do |call_info, event|
|
22
|
+
method_names << call_info.target.full_name if event == :enter
|
23
|
+
end
|
24
|
+
|
25
|
+
assert_equal(3, method_names.length)
|
26
|
+
assert_equal("CallInfoVisitorTest#test_visit", method_names[0])
|
27
|
+
assert_equal("<Class::RubyProf::C1>#hello", method_names[1])
|
28
|
+
assert_equal("Kernel#sleep", method_names[2])
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
@@ -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 DuplicateNames < TestCase
|
7
|
-
def test_names
|
8
|
-
result = RubyProf::profile do
|
9
|
-
str = %{module Foo; class Bar; def foo; end end end}
|
10
|
-
|
11
|
-
eval str
|
12
|
-
Foo::Bar.new.foo
|
13
|
-
DuplicateNames.class_eval {remove_const :Foo}
|
14
|
-
|
15
|
-
eval str
|
16
|
-
Foo::Bar.new.foo
|
17
|
-
DuplicateNames.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 == 'DuplicateNames::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 DuplicateNames < TestCase
|
7
|
+
def test_names
|
8
|
+
result = RubyProf::profile do
|
9
|
+
str = %{module Foo; class Bar; def foo; end end end}
|
10
|
+
|
11
|
+
eval str
|
12
|
+
Foo::Bar.new.foo
|
13
|
+
DuplicateNames.class_eval {remove_const :Foo}
|
14
|
+
|
15
|
+
eval str
|
16
|
+
Foo::Bar.new.foo
|
17
|
+
DuplicateNames.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 == 'DuplicateNames::Foo::Bar#foo'
|
28
|
+
end
|
29
|
+
|
30
|
+
assert_equal(3, methods.length)
|
31
|
+
end
|
32
|
+
end
|
data/test/dynamic_method_test.rb
CHANGED
@@ -1,55 +1,55 @@
|
|
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 setup
|
28
|
-
# Need to use wall time for this test due to the sleep calls
|
29
|
-
RubyProf::measure_mode = RubyProf::WALL_TIME
|
30
|
-
end
|
31
|
-
|
32
|
-
def test_dynamic_method
|
33
|
-
medley = FruitMedley.new
|
34
|
-
result = RubyProf.profile do
|
35
|
-
medley.apple
|
36
|
-
medley.orange
|
37
|
-
medley.banana
|
38
|
-
medley.peach
|
39
|
-
end
|
40
|
-
|
41
|
-
# RubyProf::FlatPrinter.new(result).print(STDOUT)
|
42
|
-
|
43
|
-
methods = result.threads.first.methods.sort.reverse
|
44
|
-
expected_method_names = %w(
|
45
|
-
DynamicMethodTest#test_dynamic_method
|
46
|
-
Kernel#sleep
|
47
|
-
DynamicMethodTest::FruitMedley#peach
|
48
|
-
DynamicMethodTest::FruitMedley#banana
|
49
|
-
DynamicMethodTest::FruitMedley#orange
|
50
|
-
DynamicMethodTest::FruitMedley#apple
|
51
|
-
Symbol#to_s
|
52
|
-
)
|
53
|
-
assert_equal expected_method_names.join("\n"), methods.map(&:full_name).join("\n")
|
54
|
-
end
|
55
|
-
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 setup
|
28
|
+
# Need to use wall time for this test due to the sleep calls
|
29
|
+
RubyProf::measure_mode = RubyProf::WALL_TIME
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_dynamic_method
|
33
|
+
medley = FruitMedley.new
|
34
|
+
result = RubyProf.profile do
|
35
|
+
medley.apple
|
36
|
+
medley.orange
|
37
|
+
medley.banana
|
38
|
+
medley.peach
|
39
|
+
end
|
40
|
+
|
41
|
+
# RubyProf::FlatPrinter.new(result).print(STDOUT)
|
42
|
+
|
43
|
+
methods = result.threads.first.methods.sort.reverse
|
44
|
+
expected_method_names = %w(
|
45
|
+
DynamicMethodTest#test_dynamic_method
|
46
|
+
Kernel#sleep
|
47
|
+
DynamicMethodTest::FruitMedley#peach
|
48
|
+
DynamicMethodTest::FruitMedley#banana
|
49
|
+
DynamicMethodTest::FruitMedley#orange
|
50
|
+
DynamicMethodTest::FruitMedley#apple
|
51
|
+
Symbol#to_s
|
52
|
+
)
|
53
|
+
assert_equal expected_method_names.join("\n"), methods.map(&:full_name).join("\n")
|
54
|
+
end
|
55
|
+
end
|
data/test/enumerable_test.rb
CHANGED
@@ -1,21 +1,21 @@
|
|
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 do
|
12
|
-
3.times { [1,2,3].any? {|n| n} }
|
13
|
-
end
|
14
|
-
methods = if RUBY_VERSION >= "2.2.0"
|
15
|
-
%w(EnumerableTest#test_enumerable Integer#times Array#any?)
|
16
|
-
else
|
17
|
-
%w(EnumerableTest#test_enumerable Integer#times Enumerable#any? Array#each)
|
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 do
|
12
|
+
3.times { [1,2,3].any? {|n| n} }
|
13
|
+
end
|
14
|
+
methods = if RUBY_VERSION >= "2.2.0"
|
15
|
+
%w(EnumerableTest#test_enumerable Integer#times Array#any?)
|
16
|
+
else
|
17
|
+
%w(EnumerableTest#test_enumerable Integer#times Enumerable#any? Array#each)
|
18
|
+
end
|
19
|
+
assert_equal(methods, result.threads.first.methods.map(&:full_name))
|
20
|
+
end
|
21
|
+
end
|
data/test/exceptions_test.rb
CHANGED
@@ -1,16 +1,24 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# encoding: UTF-8
|
3
|
-
|
4
|
-
require File.expand_path('../test_helper', __FILE__)
|
5
|
-
|
6
|
-
class ExceptionsTest < TestCase
|
7
|
-
def test_profile
|
8
|
-
result = begin
|
9
|
-
RubyProf.profile do
|
10
|
-
raise(RuntimeError, 'Test error')
|
11
|
-
end
|
12
|
-
rescue
|
13
|
-
end
|
14
|
-
|
15
|
-
end
|
16
|
-
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
require File.expand_path('../test_helper', __FILE__)
|
5
|
+
|
6
|
+
class ExceptionsTest < TestCase
|
7
|
+
def test_profile
|
8
|
+
result = begin
|
9
|
+
RubyProf.profile do
|
10
|
+
raise(RuntimeError, 'Test error')
|
11
|
+
end
|
12
|
+
rescue
|
13
|
+
end
|
14
|
+
assert_kind_of(RubyProf::Profile, result)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_profile_allows_exceptions
|
18
|
+
assert_raises(RuntimeError) do
|
19
|
+
RubyProf.profile(:allow_exceptions => true) do
|
20
|
+
raise(RuntimeError, 'Test error')
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -1,146 +1,146 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# encoding: UTF-8
|
3
|
-
|
4
|
-
require File.expand_path('../test_helper', __FILE__)
|
5
|
-
|
6
|
-
module ExcludeMethodsModule
|
7
|
-
def c
|
8
|
-
1.times { |i| ExcludeMethodsModule.d }
|
9
|
-
end
|
10
|
-
|
11
|
-
def self.d
|
12
|
-
1.times { |i| ExcludeMethodsClass.e }
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
class ExcludeMethodsClass
|
17
|
-
include ExcludeMethodsModule
|
18
|
-
|
19
|
-
def a
|
20
|
-
1.times { |i| b }
|
21
|
-
end
|
22
|
-
|
23
|
-
def b
|
24
|
-
1.times { |i| c; self.class.e }
|
25
|
-
end
|
26
|
-
|
27
|
-
def self.e
|
28
|
-
1.times { |i| f }
|
29
|
-
end
|
30
|
-
|
31
|
-
def self.f
|
32
|
-
sleep 0.1
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
class ExcludeMethodsTest < TestCase
|
37
|
-
def setup
|
38
|
-
# Need to use wall time for this test due to the sleep calls
|
39
|
-
RubyProf::measure_mode = RubyProf::WALL_TIME
|
40
|
-
end
|
41
|
-
|
42
|
-
def test_methods_can_be_profiled
|
43
|
-
obj = ExcludeMethodsClass.new
|
44
|
-
prf = RubyProf::Profile.new
|
45
|
-
|
46
|
-
result = prf.profile { 5.times {obj.a} }
|
47
|
-
methods = result.threads.first.methods.sort.reverse
|
48
|
-
|
49
|
-
assert_equal(10, methods.count)
|
50
|
-
assert_equal('ExcludeMethodsTest#test_methods_can_be_profiled', methods[0].full_name)
|
51
|
-
assert_equal('Integer#times', methods[1].full_name)
|
52
|
-
assert_equal('ExcludeMethodsClass#a', methods[2].full_name)
|
53
|
-
assert_equal('ExcludeMethodsClass#b', methods[3].full_name)
|
54
|
-
assert_equal('<Class::ExcludeMethodsClass>#e', methods[4].full_name)
|
55
|
-
assert_equal('<Class::ExcludeMethodsClass>#f', methods[5].full_name)
|
56
|
-
assert_equal('Kernel#sleep', methods[6].full_name)
|
57
|
-
assert_equal('ExcludeMethodsModule#c', methods[7].full_name)
|
58
|
-
assert_equal('<Module::ExcludeMethodsModule>#d', methods[8].full_name)
|
59
|
-
assert_equal('Kernel#class', methods[9].full_name)
|
60
|
-
end
|
61
|
-
|
62
|
-
def test_methods_can_be_hidden1
|
63
|
-
obj = ExcludeMethodsClass.new
|
64
|
-
prf = RubyProf::Profile.new
|
65
|
-
|
66
|
-
prf.exclude_methods!(Integer, :times)
|
67
|
-
|
68
|
-
result = prf.profile { 5.times {obj.a} }
|
69
|
-
methods = result.threads.first.methods.sort.reverse
|
70
|
-
|
71
|
-
assert_equal(9, methods.count)
|
72
|
-
assert_equal('ExcludeMethodsTest#test_methods_can_be_hidden1', methods[0].full_name)
|
73
|
-
assert_equal('ExcludeMethodsClass#a', methods[1].full_name)
|
74
|
-
assert_equal('ExcludeMethodsClass#b', methods[2].full_name)
|
75
|
-
assert_equal('<Class::ExcludeMethodsClass>#e', methods[3].full_name)
|
76
|
-
assert_equal('<Class::ExcludeMethodsClass>#f', methods[4].full_name)
|
77
|
-
assert_equal('Kernel#sleep', methods[5].full_name)
|
78
|
-
assert_equal('ExcludeMethodsModule#c', methods[6].full_name)
|
79
|
-
assert_equal('<Module::ExcludeMethodsModule>#d', methods[7].full_name)
|
80
|
-
assert_equal('Kernel#class', methods[8].full_name)
|
81
|
-
end
|
82
|
-
|
83
|
-
def test_methods_can_be_hidden2
|
84
|
-
obj = ExcludeMethodsClass.new
|
85
|
-
prf = RubyProf::Profile.new
|
86
|
-
|
87
|
-
prf.exclude_methods!(Integer, :times)
|
88
|
-
prf.exclude_methods!(ExcludeMethodsClass.singleton_class, :f)
|
89
|
-
prf.exclude_methods!(ExcludeMethodsModule.singleton_class, :d)
|
90
|
-
|
91
|
-
result = prf.profile { 5.times {obj.a} }
|
92
|
-
methods = result.threads.first.methods.sort.reverse
|
93
|
-
|
94
|
-
assert_equal(7, methods.count)
|
95
|
-
assert_equal('ExcludeMethodsTest#test_methods_can_be_hidden2', methods[0].full_name)
|
96
|
-
assert_equal('ExcludeMethodsClass#a', methods[1].full_name)
|
97
|
-
assert_equal('ExcludeMethodsClass#b', methods[2].full_name)
|
98
|
-
assert_equal('<Class::ExcludeMethodsClass>#e', methods[3].full_name)
|
99
|
-
assert_equal('Kernel#sleep', methods[4].full_name)
|
100
|
-
assert_equal('ExcludeMethodsModule#c', methods[5].full_name)
|
101
|
-
assert_equal('Kernel#class', methods[6].full_name)
|
102
|
-
end
|
103
|
-
|
104
|
-
def test_exclude_common_methods1
|
105
|
-
obj = ExcludeMethodsClass.new
|
106
|
-
prf = RubyProf::Profile.new
|
107
|
-
|
108
|
-
prf.exclude_common_methods!
|
109
|
-
|
110
|
-
result = prf.profile { 5.times {obj.a} }
|
111
|
-
methods = result.threads.first.methods.sort.reverse
|
112
|
-
|
113
|
-
assert_equal(9, methods.count)
|
114
|
-
assert_equal('ExcludeMethodsTest#test_exclude_common_methods1', methods[0].full_name)
|
115
|
-
assert_equal('ExcludeMethodsClass#a', methods[1].full_name)
|
116
|
-
assert_equal('ExcludeMethodsClass#b', methods[2].full_name)
|
117
|
-
end
|
118
|
-
|
119
|
-
def test_exclude_common_methods2
|
120
|
-
obj = ExcludeMethodsClass.new
|
121
|
-
|
122
|
-
result = RubyProf.profile(exclude_common: true) { 5.times {obj.a} }
|
123
|
-
methods = result.threads.first.methods.sort.reverse
|
124
|
-
|
125
|
-
assert_equal(9, methods.count)
|
126
|
-
assert_equal('ExcludeMethodsTest#test_exclude_common_methods2', methods[0].full_name)
|
127
|
-
assert_equal('ExcludeMethodsClass#a', methods[1].full_name)
|
128
|
-
assert_equal('ExcludeMethodsClass#b', methods[2].full_name)
|
129
|
-
end
|
130
|
-
|
131
|
-
private
|
132
|
-
|
133
|
-
def assert_method_has_been_eliminated(result, eliminated_method)
|
134
|
-
result.threads.each do |thread|
|
135
|
-
thread.methods.each do |method|
|
136
|
-
method.call_infos.each do |ci|
|
137
|
-
assert(ci.target != eliminated_method, "broken self")
|
138
|
-
assert(ci.parent.target != eliminated_method, "broken parent") if ci.parent
|
139
|
-
ci.children.each do |callee|
|
140
|
-
assert(callee.target != eliminated_method, "broken kid")
|
141
|
-
end
|
142
|
-
end
|
143
|
-
end
|
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
|
+
module ExcludeMethodsModule
|
7
|
+
def c
|
8
|
+
1.times { |i| ExcludeMethodsModule.d }
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.d
|
12
|
+
1.times { |i| ExcludeMethodsClass.e }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class ExcludeMethodsClass
|
17
|
+
include ExcludeMethodsModule
|
18
|
+
|
19
|
+
def a
|
20
|
+
1.times { |i| b }
|
21
|
+
end
|
22
|
+
|
23
|
+
def b
|
24
|
+
1.times { |i| c; self.class.e }
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.e
|
28
|
+
1.times { |i| f }
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.f
|
32
|
+
sleep 0.1
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
class ExcludeMethodsTest < TestCase
|
37
|
+
def setup
|
38
|
+
# Need to use wall time for this test due to the sleep calls
|
39
|
+
RubyProf::measure_mode = RubyProf::WALL_TIME
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_methods_can_be_profiled
|
43
|
+
obj = ExcludeMethodsClass.new
|
44
|
+
prf = RubyProf::Profile.new
|
45
|
+
|
46
|
+
result = prf.profile { 5.times {obj.a} }
|
47
|
+
methods = result.threads.first.methods.sort.reverse
|
48
|
+
|
49
|
+
assert_equal(10, methods.count)
|
50
|
+
assert_equal('ExcludeMethodsTest#test_methods_can_be_profiled', methods[0].full_name)
|
51
|
+
assert_equal('Integer#times', methods[1].full_name)
|
52
|
+
assert_equal('ExcludeMethodsClass#a', methods[2].full_name)
|
53
|
+
assert_equal('ExcludeMethodsClass#b', methods[3].full_name)
|
54
|
+
assert_equal('<Class::ExcludeMethodsClass>#e', methods[4].full_name)
|
55
|
+
assert_equal('<Class::ExcludeMethodsClass>#f', methods[5].full_name)
|
56
|
+
assert_equal('Kernel#sleep', methods[6].full_name)
|
57
|
+
assert_equal('ExcludeMethodsModule#c', methods[7].full_name)
|
58
|
+
assert_equal('<Module::ExcludeMethodsModule>#d', methods[8].full_name)
|
59
|
+
assert_equal('Kernel#class', methods[9].full_name)
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_methods_can_be_hidden1
|
63
|
+
obj = ExcludeMethodsClass.new
|
64
|
+
prf = RubyProf::Profile.new
|
65
|
+
|
66
|
+
prf.exclude_methods!(Integer, :times)
|
67
|
+
|
68
|
+
result = prf.profile { 5.times {obj.a} }
|
69
|
+
methods = result.threads.first.methods.sort.reverse
|
70
|
+
|
71
|
+
assert_equal(9, methods.count)
|
72
|
+
assert_equal('ExcludeMethodsTest#test_methods_can_be_hidden1', methods[0].full_name)
|
73
|
+
assert_equal('ExcludeMethodsClass#a', methods[1].full_name)
|
74
|
+
assert_equal('ExcludeMethodsClass#b', methods[2].full_name)
|
75
|
+
assert_equal('<Class::ExcludeMethodsClass>#e', methods[3].full_name)
|
76
|
+
assert_equal('<Class::ExcludeMethodsClass>#f', methods[4].full_name)
|
77
|
+
assert_equal('Kernel#sleep', methods[5].full_name)
|
78
|
+
assert_equal('ExcludeMethodsModule#c', methods[6].full_name)
|
79
|
+
assert_equal('<Module::ExcludeMethodsModule>#d', methods[7].full_name)
|
80
|
+
assert_equal('Kernel#class', methods[8].full_name)
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_methods_can_be_hidden2
|
84
|
+
obj = ExcludeMethodsClass.new
|
85
|
+
prf = RubyProf::Profile.new
|
86
|
+
|
87
|
+
prf.exclude_methods!(Integer, :times)
|
88
|
+
prf.exclude_methods!(ExcludeMethodsClass.singleton_class, :f)
|
89
|
+
prf.exclude_methods!(ExcludeMethodsModule.singleton_class, :d)
|
90
|
+
|
91
|
+
result = prf.profile { 5.times {obj.a} }
|
92
|
+
methods = result.threads.first.methods.sort.reverse
|
93
|
+
|
94
|
+
assert_equal(7, methods.count)
|
95
|
+
assert_equal('ExcludeMethodsTest#test_methods_can_be_hidden2', methods[0].full_name)
|
96
|
+
assert_equal('ExcludeMethodsClass#a', methods[1].full_name)
|
97
|
+
assert_equal('ExcludeMethodsClass#b', methods[2].full_name)
|
98
|
+
assert_equal('<Class::ExcludeMethodsClass>#e', methods[3].full_name)
|
99
|
+
assert_equal('Kernel#sleep', methods[4].full_name)
|
100
|
+
assert_equal('ExcludeMethodsModule#c', methods[5].full_name)
|
101
|
+
assert_equal('Kernel#class', methods[6].full_name)
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_exclude_common_methods1
|
105
|
+
obj = ExcludeMethodsClass.new
|
106
|
+
prf = RubyProf::Profile.new
|
107
|
+
|
108
|
+
prf.exclude_common_methods!
|
109
|
+
|
110
|
+
result = prf.profile { 5.times {obj.a} }
|
111
|
+
methods = result.threads.first.methods.sort.reverse
|
112
|
+
|
113
|
+
assert_equal(9, methods.count)
|
114
|
+
assert_equal('ExcludeMethodsTest#test_exclude_common_methods1', methods[0].full_name)
|
115
|
+
assert_equal('ExcludeMethodsClass#a', methods[1].full_name)
|
116
|
+
assert_equal('ExcludeMethodsClass#b', methods[2].full_name)
|
117
|
+
end
|
118
|
+
|
119
|
+
def test_exclude_common_methods2
|
120
|
+
obj = ExcludeMethodsClass.new
|
121
|
+
|
122
|
+
result = RubyProf.profile(exclude_common: true) { 5.times {obj.a} }
|
123
|
+
methods = result.threads.first.methods.sort.reverse
|
124
|
+
|
125
|
+
assert_equal(9, methods.count)
|
126
|
+
assert_equal('ExcludeMethodsTest#test_exclude_common_methods2', methods[0].full_name)
|
127
|
+
assert_equal('ExcludeMethodsClass#a', methods[1].full_name)
|
128
|
+
assert_equal('ExcludeMethodsClass#b', methods[2].full_name)
|
129
|
+
end
|
130
|
+
|
131
|
+
private
|
132
|
+
|
133
|
+
def assert_method_has_been_eliminated(result, eliminated_method)
|
134
|
+
result.threads.each do |thread|
|
135
|
+
thread.methods.each do |method|
|
136
|
+
method.call_infos.each do |ci|
|
137
|
+
assert(ci.target != eliminated_method, "broken self")
|
138
|
+
assert(ci.parent.target != eliminated_method, "broken parent") if ci.parent
|
139
|
+
ci.children.each do |callee|
|
140
|
+
assert(callee.target != eliminated_method, "broken kid")
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|