ruby-prof 0.16.2 → 1.1.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 +532 -467
- data/LICENSE +24 -24
- data/README.rdoc +5 -454
- data/Rakefile +110 -113
- data/bin/ruby-prof +380 -340
- data/bin/ruby-prof-check-trace +45 -45
- data/ext/ruby_prof/extconf.rb +36 -64
- data/ext/ruby_prof/rp_allocation.c +279 -0
- data/ext/ruby_prof/rp_allocation.h +31 -0
- data/ext/ruby_prof/rp_call_info.c +271 -407
- data/ext/ruby_prof/rp_call_info.h +35 -48
- data/ext/ruby_prof/rp_measure_allocations.c +52 -76
- data/ext/ruby_prof/rp_measure_memory.c +42 -77
- data/ext/ruby_prof/rp_measure_process_time.c +67 -71
- data/ext/ruby_prof/rp_measure_wall_time.c +62 -45
- data/ext/ruby_prof/rp_measurement.c +230 -0
- data/ext/ruby_prof/rp_measurement.h +50 -0
- data/ext/ruby_prof/rp_method.c +630 -411
- data/ext/ruby_prof/rp_method.h +70 -52
- data/ext/ruby_prof/rp_profile.c +895 -0
- data/ext/ruby_prof/rp_profile.h +37 -0
- data/ext/ruby_prof/rp_stack.c +196 -128
- data/ext/ruby_prof/rp_stack.h +56 -51
- data/ext/ruby_prof/rp_thread.c +337 -273
- data/ext/ruby_prof/rp_thread.h +36 -27
- data/ext/ruby_prof/ruby_prof.c +48 -671
- data/ext/ruby_prof/ruby_prof.h +17 -56
- data/ext/ruby_prof/vc/ruby_prof.sln +20 -21
- data/ext/ruby_prof/vc/{ruby_prof_20.vcxproj → ruby_prof.vcxproj} +38 -5
- data/lib/ruby-prof.rb +52 -58
- data/lib/ruby-prof/assets/call_stack_printer.html.erb +713 -0
- data/lib/ruby-prof/assets/call_stack_printer.png +0 -0
- data/lib/ruby-prof/assets/graph_printer.html.erb +356 -0
- data/lib/ruby-prof/call_info.rb +57 -126
- data/lib/ruby-prof/call_info_visitor.rb +38 -40
- data/lib/ruby-prof/compatibility.rb +109 -178
- data/lib/ruby-prof/exclude_common_methods.rb +198 -0
- data/lib/ruby-prof/measurement.rb +14 -0
- data/lib/ruby-prof/method_info.rb +90 -129
- data/lib/ruby-prof/printers/abstract_printer.rb +127 -85
- data/lib/ruby-prof/printers/call_info_printer.rb +51 -41
- data/lib/ruby-prof/printers/call_stack_printer.rb +182 -260
- data/lib/ruby-prof/printers/call_tree_printer.rb +151 -130
- data/lib/ruby-prof/printers/dot_printer.rb +132 -132
- data/lib/ruby-prof/printers/flat_printer.rb +52 -70
- data/lib/ruby-prof/printers/graph_html_printer.rb +63 -244
- data/lib/ruby-prof/printers/graph_printer.rb +114 -116
- data/lib/ruby-prof/printers/multi_printer.rb +127 -58
- data/lib/ruby-prof/profile.rb +33 -55
- data/lib/ruby-prof/rack.rb +171 -95
- data/lib/ruby-prof/task.rb +147 -147
- data/lib/ruby-prof/thread.rb +35 -41
- data/lib/ruby-prof/version.rb +3 -3
- data/lib/unprof.rb +10 -10
- data/ruby-prof.gemspec +58 -57
- data/test/abstract_printer_test.rb +26 -0
- data/test/alias_test.rb +129 -0
- data/test/basic_test.rb +129 -128
- data/test/call_info_visitor_test.rb +31 -31
- data/test/duplicate_names_test.rb +32 -32
- data/test/dynamic_method_test.rb +53 -55
- data/test/enumerable_test.rb +21 -21
- data/test/exceptions_test.rb +24 -16
- data/test/exclude_methods_test.rb +146 -0
- data/test/exclude_threads_test.rb +53 -53
- data/test/fiber_test.rb +73 -79
- data/test/gc_test.rb +96 -0
- data/test/line_number_test.rb +161 -71
- data/test/marshal_test.rb +119 -0
- data/test/measure_allocations.rb +30 -0
- data/test/measure_allocations_test.rb +385 -26
- data/test/measure_allocations_trace_test.rb +385 -0
- data/test/measure_memory_trace_test.rb +756 -0
- data/test/measure_process_time_test.rb +849 -63
- data/test/measure_times.rb +54 -0
- data/test/measure_wall_time_test.rb +459 -255
- data/test/multi_printer_test.rb +71 -83
- data/test/no_method_class_test.rb +15 -15
- data/test/parser_timings.rb +24 -0
- data/test/pause_resume_test.rb +166 -166
- data/test/prime.rb +56 -54
- data/test/printer_call_stack_test.rb +28 -0
- data/test/printer_call_tree_test.rb +31 -0
- data/test/printer_flat_test.rb +68 -0
- data/test/printer_graph_html_test.rb +60 -0
- data/test/printer_graph_test.rb +41 -0
- data/test/printers_test.rb +141 -255
- data/test/printing_recursive_graph_test.rb +81 -127
- data/test/rack_test.rb +157 -93
- data/test/recursive_test.rb +210 -215
- data/test/singleton_test.rb +38 -38
- data/test/stack_printer_test.rb +64 -78
- data/test/start_stop_test.rb +109 -112
- data/test/test_helper.rb +24 -264
- data/test/thread_test.rb +144 -187
- data/test/unique_call_path_test.rb +190 -202
- data/test/yarv_test.rb +56 -55
- metadata +34 -114
- data/doc/LICENSE.html +0 -114
- data/doc/README_rdoc.html +0 -603
- data/doc/Rack.html +0 -95
- data/doc/Rack/RubyProf.html +0 -226
- data/doc/RubyProf.html +0 -962
- data/doc/RubyProf/AbstractPrinter.html +0 -546
- data/doc/RubyProf/AggregateCallInfo.html +0 -551
- data/doc/RubyProf/CallInfo.html +0 -639
- data/doc/RubyProf/CallInfoPrinter.html +0 -120
- data/doc/RubyProf/CallInfoVisitor.html +0 -198
- data/doc/RubyProf/CallStackPrinter.html +0 -1121
- data/doc/RubyProf/CallTreePrinter.html +0 -641
- data/doc/RubyProf/Cmd.html +0 -631
- data/doc/RubyProf/DotPrinter.html +0 -257
- data/doc/RubyProf/FlatPrinter.html +0 -163
- data/doc/RubyProf/FlatPrinterWithLineNumbers.html +0 -208
- data/doc/RubyProf/GraphHtmlPrinter.html +0 -552
- data/doc/RubyProf/GraphPrinter.html +0 -139
- data/doc/RubyProf/MethodInfo.html +0 -745
- data/doc/RubyProf/MultiPrinter.html +0 -360
- data/doc/RubyProf/Profile.html +0 -763
- data/doc/RubyProf/ProfileTask.html +0 -490
- data/doc/RubyProf/Thread.html +0 -310
- data/doc/created.rid +0 -31
- data/doc/css/fonts.css +0 -167
- data/doc/css/rdoc.css +0 -590
- data/doc/examples/flat_txt.html +0 -138
- data/doc/examples/graph_html.html +0 -909
- data/doc/examples/graph_txt.html +0 -247
- 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 -626
- 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 -228
- data/doc/js/searcher.js.gz +0 -0
- data/doc/table_of_contents.html +0 -942
- data/examples/cachegrind.out.1 +0 -114
- data/examples/cachegrind.out.1.32313213 +0 -114
- data/examples/flat.txt +0 -50
- data/examples/graph.dot +0 -84
- data/examples/graph.html +0 -823
- data/examples/graph.txt +0 -139
- data/examples/multi.flat.txt +0 -23
- data/examples/multi.graph.html +0 -760
- data/examples/multi.grind.dat +0 -114
- data/examples/multi.stack.html +0 -547
- data/examples/stack.html +0 -547
- data/ext/ruby_prof/rp_measure.c +0 -40
- data/ext/ruby_prof/rp_measure.h +0 -45
- data/ext/ruby_prof/rp_measure_cpu_time.c +0 -136
- data/ext/ruby_prof/rp_measure_gc_runs.c +0 -73
- data/ext/ruby_prof/rp_measure_gc_time.c +0 -60
- data/ext/ruby_prof/vc/ruby_prof_18.vcxproj +0 -108
- data/ext/ruby_prof/vc/ruby_prof_19.vcxproj +0 -110
- data/lib/ruby-prof/aggregate_call_info.rb +0 -76
- data/lib/ruby-prof/assets/call_stack_printer.css.html +0 -117
- data/lib/ruby-prof/assets/call_stack_printer.js.html +0 -385
- data/lib/ruby-prof/printers/flat_printer_with_line_numbers.rb +0 -64
- data/test/aggregate_test.rb +0 -136
- data/test/block_test.rb +0 -74
- data/test/call_info_test.rb +0 -78
- data/test/issue137_test.rb +0 -63
- data/test/measure_cpu_time_test.rb +0 -213
- data/test/measure_gc_runs_test.rb +0 -32
- data/test/measure_gc_time_test.rb +0 -36
- data/test/measure_memory_test.rb +0 -33
- data/test/method_elimination_test.rb +0 -84
- data/test/module_test.rb +0 -45
- data/test/stack_test.rb +0 -138
data/test/prime.rb
CHANGED
@@ -1,54 +1,56 @@
|
|
1
|
-
# A silly little test program that finds prime numbers. It
|
2
|
-
# is intentionally badly designed to show off the use
|
3
|
-
# of ruby-prof.
|
4
|
-
#
|
5
|
-
# Source from http://people.cs.uchicago.edu/~bomb154/154/maclabs/profilers-lab/
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
end
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
end
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
end
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
1
|
+
# A silly little test program that finds prime numbers. It
|
2
|
+
# is intentionally badly designed to show off the use
|
3
|
+
# of ruby-prof.
|
4
|
+
#
|
5
|
+
# Source from http://people.cs.uchicago.edu/~bomb154/154/maclabs/profilers-lab/
|
6
|
+
|
7
|
+
require File.expand_path('../test_helper', __FILE__)
|
8
|
+
|
9
|
+
def make_random_array(length, maxnum)
|
10
|
+
result = Array.new(length)
|
11
|
+
result.each_index do |i|
|
12
|
+
result[i] = rand(maxnum)
|
13
|
+
end
|
14
|
+
|
15
|
+
result
|
16
|
+
end
|
17
|
+
|
18
|
+
def is_prime(x)
|
19
|
+
y = 2
|
20
|
+
y.upto(x-1) do |i|
|
21
|
+
return false if (x % i) == 0
|
22
|
+
end
|
23
|
+
true
|
24
|
+
end
|
25
|
+
|
26
|
+
def find_primes(arr)
|
27
|
+
result = arr.select do |value|
|
28
|
+
is_prime(value)
|
29
|
+
end
|
30
|
+
result
|
31
|
+
end
|
32
|
+
|
33
|
+
def find_largest(primes)
|
34
|
+
largest = primes.first
|
35
|
+
|
36
|
+
# Intentionally use upto for example purposes
|
37
|
+
# (upto is also called from is_prime)
|
38
|
+
0.upto(primes.length-1) do |i|
|
39
|
+
prime = primes[i]
|
40
|
+
if prime > largest
|
41
|
+
largest = prime
|
42
|
+
end
|
43
|
+
end
|
44
|
+
largest
|
45
|
+
end
|
46
|
+
|
47
|
+
def run_primes(length=10, maxnum=1000)
|
48
|
+
# Create random numbers
|
49
|
+
random_array = make_random_array(length, maxnum)
|
50
|
+
|
51
|
+
# Find the primes
|
52
|
+
primes = find_primes(random_array)
|
53
|
+
|
54
|
+
# Find the largest primes
|
55
|
+
find_largest(primes)
|
56
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
require File.expand_path('../test_helper', __FILE__)
|
5
|
+
require 'stringio'
|
6
|
+
require 'fileutils'
|
7
|
+
require 'tmpdir'
|
8
|
+
require_relative 'prime'
|
9
|
+
|
10
|
+
# -- Tests ----
|
11
|
+
class PrinterCallStackTest < TestCase
|
12
|
+
def setup
|
13
|
+
# WALL_TIME so we can use sleep in our test and get same measurements on linux and windows
|
14
|
+
RubyProf::measure_mode = RubyProf::WALL_TIME
|
15
|
+
@result = RubyProf.profile do
|
16
|
+
run_primes(1000, 5000)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_graph_html_string
|
21
|
+
output = ''
|
22
|
+
printer = RubyProf::CallStackPrinter.new(@result)
|
23
|
+
printer.print(output)
|
24
|
+
|
25
|
+
assert_match(/<!DOCTYPE html>/i, output)
|
26
|
+
assert_match(/Object#run_primes/i, output)
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
require File.expand_path('../test_helper', __FILE__)
|
5
|
+
require 'stringio'
|
6
|
+
require 'fileutils'
|
7
|
+
require 'tmpdir'
|
8
|
+
require_relative 'prime'
|
9
|
+
|
10
|
+
# -- Tests ----
|
11
|
+
class PrinterCallTreeTest < TestCase
|
12
|
+
def setup
|
13
|
+
# WALL_TIME so we can use sleep in our test and get same measurements on linux and windows
|
14
|
+
RubyProf::measure_mode = RubyProf::WALL_TIME
|
15
|
+
@result = RubyProf.profile do
|
16
|
+
run_primes(1000, 5000)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_call_tree_string
|
21
|
+
printer = RubyProf::CallTreePrinter.new(@result)
|
22
|
+
|
23
|
+
printer.print(:profile => "lolcat", :path => Dir.tmpdir)
|
24
|
+
main_output_file_name = File.join(Dir.tmpdir, "lolcat.callgrind.out.#{$$}")
|
25
|
+
assert(File.exist?(main_output_file_name))
|
26
|
+
output = File.read(main_output_file_name)
|
27
|
+
assert_match(/fn=Object::find_primes/i, output)
|
28
|
+
assert_match(/events: wall_time/i, output)
|
29
|
+
refute_match(/d\d\d\d\d\d/, output) # old bug looked [in error] like Object::run_primes(d5833116)
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
require File.expand_path('../test_helper', __FILE__)
|
5
|
+
require 'stringio'
|
6
|
+
require 'fileutils'
|
7
|
+
require 'tmpdir'
|
8
|
+
require_relative 'prime'
|
9
|
+
|
10
|
+
# -- Tests ----
|
11
|
+
class PrinterFlatTest < TestCase
|
12
|
+
def setup
|
13
|
+
# WALL_TIME so we can use sleep in our test and get same measurements on linux and windows
|
14
|
+
RubyProf::measure_mode = RubyProf::WALL_TIME
|
15
|
+
@result = RubyProf.profile do
|
16
|
+
run_primes(1000, 5000)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def flat_output_nth_column_values(output, n)
|
21
|
+
only_method_calls = output.split("\n").select { |line| line =~ /^ +\d+/ }
|
22
|
+
only_method_calls.collect { |line| line.split(/ +/)[n] }
|
23
|
+
end
|
24
|
+
|
25
|
+
def assert_sorted array
|
26
|
+
array = array.map{|n| n.to_f} # allow for > 10s times to sort right, since lexographically 4.0 > 10.0
|
27
|
+
assert_equal array, array.sort.reverse, "Array #{array.inspect} is not sorted"
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_flat_string
|
31
|
+
output = helper_test_flat_string(RubyProf::FlatPrinter)
|
32
|
+
assert_match(/prime.rb/, output)
|
33
|
+
end
|
34
|
+
|
35
|
+
def helper_test_flat_string(klass)
|
36
|
+
output = ''
|
37
|
+
|
38
|
+
printer = klass.new(@result)
|
39
|
+
printer.print(output)
|
40
|
+
|
41
|
+
assert_match(/Thread ID: -?\d+/i, output)
|
42
|
+
assert_match(/Fiber ID: -?\d+/i, output)
|
43
|
+
assert_match(/Total: \d+\.\d+/i, output)
|
44
|
+
assert_match(/Object#run_primes/i, output)
|
45
|
+
output
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_flat_result_sorting_by_self_time_is_default
|
49
|
+
printer = RubyProf::FlatPrinter.new(@result)
|
50
|
+
|
51
|
+
printer.print(output = '')
|
52
|
+
self_times = flat_output_nth_column_values(output, 3)
|
53
|
+
|
54
|
+
assert_sorted self_times
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_flat_result_sorting
|
58
|
+
printer = RubyProf::FlatPrinter.new(@result)
|
59
|
+
|
60
|
+
sort_method_with_column_number = {:total_time => 2, :self_time => 3, :wait_time => 4, :children_time => 5}
|
61
|
+
|
62
|
+
sort_method_with_column_number.each_pair do |sort_method, n|
|
63
|
+
printer.print(output = '', :sort_method => sort_method)
|
64
|
+
times = flat_output_nth_column_values(output, n)
|
65
|
+
assert_sorted times
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
require File.expand_path('../test_helper', __FILE__)
|
5
|
+
require 'stringio'
|
6
|
+
require 'fileutils'
|
7
|
+
require 'tmpdir'
|
8
|
+
require_relative 'prime'
|
9
|
+
|
10
|
+
# -- Tests ----
|
11
|
+
class PrinterGraphHtmlTest < TestCase
|
12
|
+
def setup
|
13
|
+
# WALL_TIME so we can use sleep in our test and get same measurements on linux and windows
|
14
|
+
RubyProf::measure_mode = RubyProf::WALL_TIME
|
15
|
+
@result = RubyProf.profile do
|
16
|
+
run_primes(1000, 5000)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def graph_html_output_nth_column_values(output, n)
|
21
|
+
only_root_calls = output.split('<tr class="method">')
|
22
|
+
only_root_calls.delete_at(0)
|
23
|
+
only_root_calls.collect {|line| line.scan(/[\d\.]+/)[n - 1] }
|
24
|
+
end
|
25
|
+
|
26
|
+
def assert_sorted array
|
27
|
+
array = array.map{|n| n.to_f} # allow for > 10s times to sort right, since lexographically 4.0 > 10.0
|
28
|
+
assert_equal array, array.sort.reverse, "Array #{array.inspect} is not sorted"
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_graph_html_string
|
32
|
+
output = ''
|
33
|
+
printer = RubyProf::GraphHtmlPrinter.new(@result)
|
34
|
+
printer.print(output)
|
35
|
+
|
36
|
+
assert_match(/<!DOCTYPE html>/i, output)
|
37
|
+
assert_match( %r{<th>Total</th>}i, output)
|
38
|
+
assert_match(/Object#run_primes/i, output)
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_graph_html_result_sorting_by_total_time_is_default
|
42
|
+
printer = RubyProf::GraphHtmlPrinter.new(@result)
|
43
|
+
printer.print(output = '')
|
44
|
+
total_times = graph_html_output_nth_column_values(output, 3)
|
45
|
+
|
46
|
+
assert_sorted total_times
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_graph_html_result_sorting
|
50
|
+
printer = RubyProf::GraphHtmlPrinter.new(@result)
|
51
|
+
|
52
|
+
sort_method_with_column_number = {:total_time => 3, :self_time => 4, :wait_time => 5, :children_time => 6}
|
53
|
+
|
54
|
+
sort_method_with_column_number.each_pair do |sort_method, n|
|
55
|
+
printer.print(output = '', :sort_method => sort_method)
|
56
|
+
times = graph_html_output_nth_column_values(output, n)
|
57
|
+
assert_sorted times
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
require File.expand_path('../test_helper', __FILE__)
|
5
|
+
require 'stringio'
|
6
|
+
require 'fileutils'
|
7
|
+
require 'tmpdir'
|
8
|
+
require_relative 'prime'
|
9
|
+
|
10
|
+
# -- Tests ----
|
11
|
+
class PrinterGraphTest < TestCase
|
12
|
+
def setup
|
13
|
+
# WALL_TIME so we can use sleep in our test and get same measurements on linux and windows
|
14
|
+
RubyProf::measure_mode = RubyProf::WALL_TIME
|
15
|
+
@result = RubyProf.profile do
|
16
|
+
run_primes(1000, 5000)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def graph_output_nth_column_values(output, n)
|
21
|
+
only_root_calls = output.split("\n").select { |line| line =~ /^ +[\d\.]+%/ }
|
22
|
+
only_root_calls.collect { |line| line.split(/ +/)[n] }
|
23
|
+
end
|
24
|
+
|
25
|
+
def assert_sorted array
|
26
|
+
array = array.map{|n| n.to_f} # allow for > 10s times to sort right, since lexographically 4.0 > 10.0
|
27
|
+
assert_equal array, array.sort.reverse, "Array #{array.inspect} is not sorted"
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_graph_results_sorting
|
31
|
+
printer = RubyProf::GraphPrinter.new(@result)
|
32
|
+
|
33
|
+
sort_method_with_column_number = {:total_time => 3, :self_time => 4, :wait_time => 5, :children_time => 6}
|
34
|
+
|
35
|
+
sort_method_with_column_number.each_pair do |sort_method, n|
|
36
|
+
printer.print(output = '', :sort_method => sort_method)
|
37
|
+
times = graph_output_nth_column_values(output, n)
|
38
|
+
assert_sorted times
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/test/printers_test.rb
CHANGED
@@ -1,255 +1,141 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# encoding: UTF-8
|
3
|
-
|
4
|
-
require File.expand_path('../test_helper', __FILE__)
|
5
|
-
require 'stringio'
|
6
|
-
require 'fileutils'
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
end
|
70
|
-
|
71
|
-
def
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
assert_match(/
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
# RubyProf::FlatPrinterWithLineNumbers same
|
143
|
-
for klass in [ RubyProf::GraphPrinter, RubyProf::GraphHtmlPrinter]
|
144
|
-
printer = klass.new(result)
|
145
|
-
out = ''
|
146
|
-
printer.print(out, :min_percent => 0.00000001)
|
147
|
-
assert_match(/do_nothing/, out)
|
148
|
-
end
|
149
|
-
|
150
|
-
end
|
151
|
-
|
152
|
-
def test_flat_result_sorting_by_self_time_is_default
|
153
|
-
printer = RubyProf::FlatPrinter.new(@result)
|
154
|
-
|
155
|
-
printer.print(output = '')
|
156
|
-
self_times = flat_output_nth_column_values(output, 3)
|
157
|
-
|
158
|
-
assert_sorted self_times
|
159
|
-
end
|
160
|
-
|
161
|
-
def test_flat_result_sorting
|
162
|
-
printer = RubyProf::FlatPrinter.new(@result)
|
163
|
-
|
164
|
-
sort_method_with_column_number = {:total_time => 2, :self_time => 3, :wait_time => 4, :children_time => 5}
|
165
|
-
|
166
|
-
sort_method_with_column_number.each_pair do |sort_method, n|
|
167
|
-
printer.print(output = '', :sort_method => sort_method)
|
168
|
-
times = flat_output_nth_column_values(output, n)
|
169
|
-
assert_sorted times
|
170
|
-
end
|
171
|
-
end
|
172
|
-
|
173
|
-
def test_flat_result_with_line_numbers_sorting_by_self_time_is_default
|
174
|
-
printer = RubyProf::FlatPrinterWithLineNumbers.new(@result)
|
175
|
-
|
176
|
-
printer.print(output = '')
|
177
|
-
self_times = flat_output_nth_column_values(output, 3)
|
178
|
-
|
179
|
-
assert_sorted self_times
|
180
|
-
end
|
181
|
-
|
182
|
-
def test_flat_with_line_numbers_result_sorting
|
183
|
-
printer = RubyProf::FlatPrinterWithLineNumbers.new(@result)
|
184
|
-
|
185
|
-
sort_method_with_column_number = {:total_time => 2, :self_time => 3, :wait_time => 4, :children_time => 5}
|
186
|
-
|
187
|
-
sort_method_with_column_number.each_pair do |sort_method, n|
|
188
|
-
printer.print(output = '', :sort_method => sort_method)
|
189
|
-
times = flat_output_nth_column_values(output, n)
|
190
|
-
assert_sorted times
|
191
|
-
end
|
192
|
-
end
|
193
|
-
|
194
|
-
def test_graph_result_sorting_by_total_time_is_default
|
195
|
-
printer = RubyProf::GraphPrinter.new(@result)
|
196
|
-
printer.print(output = '')
|
197
|
-
total_times = graph_output_nth_column_values(output, 3)
|
198
|
-
|
199
|
-
assert_sorted total_times
|
200
|
-
end
|
201
|
-
|
202
|
-
def test_graph_results_sorting
|
203
|
-
printer = RubyProf::GraphPrinter.new(@result)
|
204
|
-
|
205
|
-
sort_method_with_column_number = {:total_time => 3, :self_time => 4, :wait_time => 5, :children_time => 6}
|
206
|
-
|
207
|
-
sort_method_with_column_number.each_pair do |sort_method, n|
|
208
|
-
printer.print(output = '', :sort_method => sort_method)
|
209
|
-
times = graph_output_nth_column_values(output, n)
|
210
|
-
assert_sorted times
|
211
|
-
end
|
212
|
-
end
|
213
|
-
|
214
|
-
def test_graph_html_result_sorting_by_total_time_is_default
|
215
|
-
printer = RubyProf::GraphHtmlPrinter.new(@result)
|
216
|
-
printer.print(output = '')
|
217
|
-
total_times = graph_html_output_nth_column_values(output, 3)
|
218
|
-
|
219
|
-
assert_sorted total_times
|
220
|
-
end
|
221
|
-
|
222
|
-
def test_graph_html_result_sorting
|
223
|
-
printer = RubyProf::GraphHtmlPrinter.new(@result)
|
224
|
-
|
225
|
-
sort_method_with_column_number = {:total_time => 3, :self_time => 4, :wait_time => 5, :children_time => 6}
|
226
|
-
|
227
|
-
sort_method_with_column_number.each_pair do |sort_method, n|
|
228
|
-
printer.print(output = '', :sort_method => sort_method)
|
229
|
-
times = graph_html_output_nth_column_values(output, n)
|
230
|
-
assert_sorted times
|
231
|
-
end
|
232
|
-
end
|
233
|
-
|
234
|
-
private
|
235
|
-
def flat_output_nth_column_values(output, n)
|
236
|
-
only_method_calls = output.split("\n").select { |line| line =~ /^ +\d+/ }
|
237
|
-
only_method_calls.collect { |line| line.split(/ +/)[n] }
|
238
|
-
end
|
239
|
-
|
240
|
-
def graph_output_nth_column_values(output, n)
|
241
|
-
only_root_calls = output.split("\n").select { |line| line =~ /^ +[\d\.]+%/ }
|
242
|
-
only_root_calls.collect { |line| line.split(/ +/)[n] }
|
243
|
-
end
|
244
|
-
|
245
|
-
def graph_html_output_nth_column_values(output, n)
|
246
|
-
only_root_calls = output.split('<tr class="method">')
|
247
|
-
only_root_calls.delete_at(0)
|
248
|
-
only_root_calls.collect {|line| line.scan(/[\d\.]+/)[n - 1] }
|
249
|
-
end
|
250
|
-
|
251
|
-
def assert_sorted array
|
252
|
-
array = array.map{|n| n.to_f} # allow for > 10s times to sort right, since lexographically 4.0 > 10.0
|
253
|
-
assert_equal array, array.sort.reverse, "Array #{array.inspect} is not sorted"
|
254
|
-
end
|
255
|
-
end
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
require File.expand_path('../test_helper', __FILE__)
|
5
|
+
require 'stringio'
|
6
|
+
require 'fileutils'
|
7
|
+
require 'tmpdir'
|
8
|
+
require_relative 'prime'
|
9
|
+
|
10
|
+
# -- Tests ----
|
11
|
+
class PrintersTest < TestCase
|
12
|
+
def setup
|
13
|
+
# WALL_TIME so we can use sleep in our test and get same measurements on linux and windows
|
14
|
+
RubyProf::measure_mode = RubyProf::WALL_TIME
|
15
|
+
@result = RubyProf.profile do
|
16
|
+
run_primes(1000, 5000)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_printers
|
21
|
+
output = ENV['SHOW_RUBY_PROF_PRINTER_OUTPUT'] == "1" ? STDOUT : StringIO.new('')
|
22
|
+
|
23
|
+
printer = RubyProf::CallInfoPrinter.new(@result)
|
24
|
+
printer.print(output)
|
25
|
+
|
26
|
+
printer = RubyProf::CallTreePrinter.new(@result)
|
27
|
+
printer.print()
|
28
|
+
|
29
|
+
printer = RubyProf::FlatPrinter.new(@result)
|
30
|
+
printer.print(output)
|
31
|
+
|
32
|
+
printer = RubyProf::GraphHtmlPrinter.new(@result)
|
33
|
+
printer.print(output)
|
34
|
+
|
35
|
+
printer = RubyProf::GraphPrinter.new(@result)
|
36
|
+
printer.print(output)
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_print_to_files
|
40
|
+
output_dir = 'examples2'
|
41
|
+
|
42
|
+
if ENV['SAVE_NEW_PRINTER_EXAMPLES']
|
43
|
+
output_dir = 'examples'
|
44
|
+
end
|
45
|
+
FileUtils.mkdir_p output_dir
|
46
|
+
|
47
|
+
printer = RubyProf::DotPrinter.new(@result)
|
48
|
+
File.open("#{output_dir}/graph.dot", "w") {|f| printer.print(f)}
|
49
|
+
|
50
|
+
printer = RubyProf::CallStackPrinter.new(@result)
|
51
|
+
File.open("#{output_dir}/stack.html", "w") {|f| printer.print(f, :application => "primes")}
|
52
|
+
|
53
|
+
# printer = RubyProf::MultiPrinter.new(@result)
|
54
|
+
# printer.print(:path => "#{output_dir}", :profile => "multi", :application => "primes")
|
55
|
+
# for file in ['graph.dot', 'multi.flat.txt', 'multi.graph.html', "multi.callgrind.out.#{$$}", 'multi.stack.html', 'stack.html']
|
56
|
+
# existant_file = output_dir + '/' + file
|
57
|
+
# assert File.size(existant_file) > 0
|
58
|
+
# end
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_refuses_io_objects
|
62
|
+
p = RubyProf::MultiPrinter.new(@result)
|
63
|
+
begin
|
64
|
+
p.print(STDOUT)
|
65
|
+
flunk "should have raised an ArgumentError"
|
66
|
+
rescue ArgumentError => e
|
67
|
+
assert_match(/IO/, e.to_s)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_refuses_non_hashes
|
72
|
+
p = RubyProf::MultiPrinter.new (@result)
|
73
|
+
begin
|
74
|
+
p.print([])
|
75
|
+
flunk "should have raised an ArgumentError"
|
76
|
+
rescue ArgumentError => e
|
77
|
+
assert_match(/hash/, e.to_s)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_flat_string
|
82
|
+
output = helper_test_flat_string(RubyProf::FlatPrinter)
|
83
|
+
assert_match(/prime.rb/, output)
|
84
|
+
end
|
85
|
+
|
86
|
+
def helper_test_flat_string(klass)
|
87
|
+
output = ''
|
88
|
+
|
89
|
+
printer = klass.new(@result)
|
90
|
+
printer.print(output)
|
91
|
+
|
92
|
+
assert_match(/Thread ID: -?\d+/i, output)
|
93
|
+
assert_match(/Fiber ID: -?\d+/i, output)
|
94
|
+
assert_match(/Total: \d+\.\d+/i, output)
|
95
|
+
assert_match(/Object#run_primes/i, output)
|
96
|
+
output
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_graph_html_string
|
100
|
+
output = ''
|
101
|
+
printer = RubyProf::GraphHtmlPrinter.new(@result)
|
102
|
+
printer.print(output)
|
103
|
+
|
104
|
+
assert_match(/<!DOCTYPE html>/i, output)
|
105
|
+
assert_match( %r{<th>Total</th>}i, output)
|
106
|
+
assert_match(/Object#run_primes/i, output)
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_graph_string
|
110
|
+
output = ''
|
111
|
+
printer = RubyProf::GraphPrinter.new(@result)
|
112
|
+
printer.print(output)
|
113
|
+
|
114
|
+
assert_match(/Thread ID: -?\d+/i, output)
|
115
|
+
assert_match(/Fiber ID: -?\d+/i, output)
|
116
|
+
assert_match(/Total Time: \d+\.\d+/i, output)
|
117
|
+
assert_match(/Object#run_primes/i, output)
|
118
|
+
end
|
119
|
+
|
120
|
+
def do_nothing
|
121
|
+
start = Time.now
|
122
|
+
while(Time.now == start)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def test_all_with_small_percentiles
|
127
|
+
result = RubyProf.profile do
|
128
|
+
sleep 2
|
129
|
+
do_nothing
|
130
|
+
end
|
131
|
+
|
132
|
+
# RubyProf::CallTreePrinter doesn't "do" a min_percent
|
133
|
+
# RubyProf::FlatPrinter only outputs if self time > percent...
|
134
|
+
for klass in [RubyProf::GraphPrinter, RubyProf::GraphHtmlPrinter]
|
135
|
+
printer = klass.new(result)
|
136
|
+
out = ''
|
137
|
+
printer.print(out, :min_percent => 0.00000001)
|
138
|
+
assert_match(/do_nothing/, out)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|