acunote-ruby-prof 0.9.2

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 (84) hide show
  1. data/CHANGES +240 -0
  2. data/LICENSE +23 -0
  3. data/README.rdoc +439 -0
  4. data/Rakefile +148 -0
  5. data/bin/ruby-prof +236 -0
  6. data/examples/empty.png +0 -0
  7. data/examples/flat.txt +55 -0
  8. data/examples/graph.dot +106 -0
  9. data/examples/graph.html +823 -0
  10. data/examples/graph.png +0 -0
  11. data/examples/graph.txt +170 -0
  12. data/examples/minus.png +0 -0
  13. data/examples/multi.flat.txt +23 -0
  14. data/examples/multi.graph.html +906 -0
  15. data/examples/multi.grind.dat +194 -0
  16. data/examples/multi.stack.html +573 -0
  17. data/examples/plus.png +0 -0
  18. data/examples/stack.html +573 -0
  19. data/ext/ruby_prof/extconf.rb +43 -0
  20. data/ext/ruby_prof/measure_allocations.h +58 -0
  21. data/ext/ruby_prof/measure_cpu_time.h +152 -0
  22. data/ext/ruby_prof/measure_gc_runs.h +76 -0
  23. data/ext/ruby_prof/measure_gc_time.h +57 -0
  24. data/ext/ruby_prof/measure_memory.h +101 -0
  25. data/ext/ruby_prof/measure_process_time.h +52 -0
  26. data/ext/ruby_prof/measure_wall_time.h +53 -0
  27. data/ext/ruby_prof/mingw/Rakefile +23 -0
  28. data/ext/ruby_prof/mingw/build.rake +38 -0
  29. data/ext/ruby_prof/ruby_prof.c +1834 -0
  30. data/ext/ruby_prof/ruby_prof.h +190 -0
  31. data/ext/ruby_prof/version.h +4 -0
  32. data/lib/ruby-prof.rb +62 -0
  33. data/lib/ruby-prof/abstract_printer.rb +41 -0
  34. data/lib/ruby-prof/aggregate_call_info.rb +68 -0
  35. data/lib/ruby-prof/call_info.rb +112 -0
  36. data/lib/ruby-prof/call_stack_printer.rb +751 -0
  37. data/lib/ruby-prof/call_tree_printer.rb +133 -0
  38. data/lib/ruby-prof/dot_printer.rb +153 -0
  39. data/lib/ruby-prof/empty.png +0 -0
  40. data/lib/ruby-prof/flat_printer.rb +78 -0
  41. data/lib/ruby-prof/flat_printer_with_line_numbers.rb +72 -0
  42. data/lib/ruby-prof/graph_html_printer.rb +278 -0
  43. data/lib/ruby-prof/graph_printer.rb +245 -0
  44. data/lib/ruby-prof/method_info.rb +131 -0
  45. data/lib/ruby-prof/minus.png +0 -0
  46. data/lib/ruby-prof/multi_printer.rb +54 -0
  47. data/lib/ruby-prof/plus.png +0 -0
  48. data/lib/ruby-prof/rack.rb +30 -0
  49. data/lib/ruby-prof/result.rb +70 -0
  50. data/lib/ruby-prof/symbol_to_proc.rb +8 -0
  51. data/lib/ruby-prof/task.rb +146 -0
  52. data/lib/ruby-prof/test.rb +148 -0
  53. data/lib/unprof.rb +8 -0
  54. data/rails/environment/profile.rb +24 -0
  55. data/rails/example/example_test.rb +9 -0
  56. data/rails/profile_test_helper.rb +21 -0
  57. data/test/aggregate_test.rb +136 -0
  58. data/test/basic_test.rb +290 -0
  59. data/test/current_failures_windows +8 -0
  60. data/test/do_nothing.rb +0 -0
  61. data/test/duplicate_names_test.rb +32 -0
  62. data/test/enumerable_test.rb +16 -0
  63. data/test/exceptions_test.rb +15 -0
  64. data/test/exclude_threads_test.rb +54 -0
  65. data/test/exec_test.rb +14 -0
  66. data/test/line_number_test.rb +73 -0
  67. data/test/measurement_test.rb +122 -0
  68. data/test/method_elimination_test.rb +74 -0
  69. data/test/module_test.rb +44 -0
  70. data/test/multi_printer_test.rb +81 -0
  71. data/test/no_method_class_test.rb +13 -0
  72. data/test/prime.rb +55 -0
  73. data/test/prime_test.rb +13 -0
  74. data/test/printers_test.rb +164 -0
  75. data/test/recursive_test.rb +236 -0
  76. data/test/ruby-prof-bin +20 -0
  77. data/test/singleton_test.rb +38 -0
  78. data/test/stack_printer_test.rb +74 -0
  79. data/test/stack_test.rb +138 -0
  80. data/test/start_stop_test.rb +112 -0
  81. data/test/test_suite.rb +32 -0
  82. data/test/thread_test.rb +173 -0
  83. data/test/unique_call_path_test.rb +225 -0
  84. metadata +185 -0
@@ -0,0 +1,148 @@
1
+ require 'rubygems'
2
+ require 'rake/gempackagetask'
3
+ require 'rake/rdoctask'
4
+ require 'rake/testtask'
5
+ require 'date'
6
+
7
+ # ------- Version ----
8
+ # Read version from header file
9
+ version_header = File.read('ext/ruby_prof/version.h')
10
+ match = version_header.match(/RUBY_PROF_VERSION\s*["](\d.+)["]/)
11
+ raise(RuntimeError, "Could not determine RUBY_PROF_VERSION") if not match
12
+ RUBY_PROF_VERSION = match[1]
13
+
14
+
15
+ # ------- Default Package ----------
16
+ FILES = FileList[
17
+ 'Rakefile',
18
+ 'README.rdoc',
19
+ 'LICENSE',
20
+ 'CHANGES',
21
+ 'bin/*',
22
+ 'doc/**/*',
23
+ 'examples/*',
24
+ 'ext/ruby_prof/*.c',
25
+ 'ext/ruby_prof/*.h',
26
+ 'ext/ruby_prof/mingw/Rakefile',
27
+ 'ext/ruby_prof/mingw/build.rake',
28
+ 'ext/vc/*.sln',
29
+ 'ext/vc/*.vcproj',
30
+ 'lib/**/*',
31
+ 'rails/**/*',
32
+ 'test/*'
33
+ ]
34
+
35
+ # Default GEM Specification
36
+ default_spec = Gem::Specification.new do |spec|
37
+ spec.name = "acunote-ruby-prof"
38
+
39
+ spec.homepage = "http://rubyforge.org/projects/ruby-prof/"
40
+ spec.summary = "Fast Ruby profiler"
41
+ spec.description = <<-EOF
42
+ ruby-prof is a fast code profiler for Ruby. It is a C extension and
43
+ therefore is many times faster than the standard Ruby profiler. It
44
+ supports both flat and graph profiles. For each method, graph profiles
45
+ show how long the method ran, which methods called it and which
46
+ methods it called. RubyProf generate both text and html and can output
47
+ it to standard out or to a file.
48
+ EOF
49
+
50
+ spec.version = RUBY_PROF_VERSION
51
+
52
+ spec.author = "Shugo Maeda, Charlie Savage, Roger Pack, Stefan Kaes"
53
+ spec.email = "shugo@ruby-lang.org, cfis@savagexi.com, rogerdpack@gmail.com, skaes@railsexpress.de"
54
+ spec.platform = Gem::Platform::RUBY
55
+ spec.require_path = "lib"
56
+ spec.bindir = "bin"
57
+ spec.executables = ["ruby-prof"]
58
+ spec.extensions = ["ext/ruby_prof/extconf.rb"]
59
+ spec.files = FILES.to_a
60
+ spec.test_files = Dir["test/test_*.rb"]
61
+ spec.required_ruby_version = '>= 1.8.4'
62
+ spec.date = DateTime.now
63
+ spec.rubyforge_project = 'ruby-prof'
64
+ spec.add_development_dependency 'os'
65
+ spec.add_development_dependency 'rake-compiler'
66
+
67
+ end
68
+
69
+
70
+ desc 'build native .gem files -- use like "native_gems clobber cross native gem"--for non native gem creation use "native_gems clobber" then "clean gem"'
71
+ task :native_gems do
72
+ ENV['RUBY_CC_VERSION'] = '1.8.6:1.9.1'
73
+ require 'rake/extensiontask'
74
+ Rake::ExtensionTask.new('ruby_prof', default_spec) do |ext|
75
+ ext.cross_compile = true
76
+ ext.cross_platform = ['x86-mswin32-60', 'x86-mingw32-60']
77
+ end
78
+ end
79
+
80
+ # Rake task to build the default package
81
+ Rake::GemPackageTask.new(default_spec) do |pkg|
82
+ pkg.need_tar = true
83
+ #pkg.need_zip = true
84
+ end
85
+
86
+
87
+ # --------- RDoc Documentation ------
88
+ desc "Generate rdoc documentation"
89
+ Rake::RDocTask.new("rdoc") do |rdoc|
90
+ rdoc.rdoc_dir = 'doc'
91
+ rdoc.title = "ruby-prof"
92
+ # Show source inline with line numbers
93
+ rdoc.options << "--inline-source" << "--line-numbers"
94
+ # Make the readme file the start page for the generated html
95
+ rdoc.options << '--main' << 'README.rdoc'
96
+ rdoc.rdoc_files.include('bin/**/*',
97
+ 'doc/*.rdoc',
98
+ 'examples/flat.txt',
99
+ 'examples/graph.txt',
100
+ 'examples/graph.html',
101
+ 'lib/**/*.rb',
102
+ 'ext/ruby_prof/ruby_prof.c',
103
+ 'ext/ruby_prof/version.h',
104
+ 'ext/ruby_prof/measure_*.h',
105
+ 'README.rdoc',
106
+ 'LICENSE')
107
+ end
108
+
109
+ task :default => :package
110
+
111
+ desc 'Run the ruby-prof test suite'
112
+ Rake::TestTask.new do |t|
113
+ t.libs += %w(lib ext test)
114
+ t.test_files = Dir['test/test_suite.rb']
115
+ t.verbose = true
116
+ t.warning = true
117
+ end
118
+
119
+ require 'fileutils'
120
+
121
+ desc 'Build ruby_prof.so'
122
+ task :build do
123
+ Dir.chdir('ext/ruby_prof') do
124
+ unless File.exist? 'Makefile'
125
+ system(Gem.ruby + " extconf.rb")
126
+ system("make clean")
127
+ end
128
+ system("make")
129
+ FileUtils.cp 'ruby_prof.so', '../../lib' if File.exist? 'lib/ruby_prof.so'
130
+ FileUtils.cp 'ruby_prof.bundle', '../../lib' if File.exist? 'lib/ruby_prof.bundle'
131
+ end
132
+ end
133
+
134
+ desc 'clean stuff'
135
+ task :cleanr do
136
+ FileUtils.rm 'lib/ruby_prof.so' if File.exist? 'lib/ruby_prof.so'
137
+ FileUtils.rm 'lib/ruby_prof.bundle' if File.exist? 'lib/ruby_prof.bundle'
138
+ Dir.chdir('ext/ruby_prof') do
139
+ if File.exist? 'Makefile'
140
+ system("make clean")
141
+ FileUtils.rm 'Makefile'
142
+ end
143
+ Dir.glob('*~') do |file|
144
+ FileUtils.rm file
145
+ end
146
+ end
147
+ system("rm -rf pkg")
148
+ end
@@ -0,0 +1,236 @@
1
+ #! /usr/bin/env ruby
2
+
3
+ # == Synopsis
4
+ #
5
+ # Profiles a Ruby program.
6
+ #
7
+ # == Usage
8
+ #
9
+ # ruby_prof [options] <script.rb> [--] [script-options]"
10
+ #
11
+ # Options:
12
+ # -p, --printer=printer Select a printer:
13
+ # flat - Prints a flat profile as text (default).
14
+ # flat_with_line_numbers - Above, with line numbers
15
+ # graph - Prints a graph profile as text.
16
+ # graph_html - Prints a graph profile as html.
17
+ # call_tree - format for KCacheGrind
18
+ # call_stack - prints a HTML visualization of the call tree
19
+ # dot - Prints a graph profile as a dot file
20
+ # -f, --file=path Output results to a file instead of standard out.
21
+ # -m, --min_percent=min_percent The minimum percent a method must take before ',
22
+ # being included in output reports. Should be an
23
+ # integer between 1 and 100. 0 means all methods are printed.
24
+ # --mode=measure_mode Select a measurement mode:
25
+ # process - Use process time (default).
26
+ # wall - Use wall time.
27
+ # cpu - Use the CPU clock counter
28
+ # (only supported on Pentium and PowerPCs).
29
+ # allocations - Tracks object allocations
30
+ # (requires a patched Ruby interpreter).
31
+ # memory - Tracks total memory size
32
+ # (requires a patched Ruby interpreter).
33
+ # gc_runs - Tracks number of garbage collection runs
34
+ # (requires a patched Ruby interpreter).
35
+ # gc_time - Tracks time spent doing garbage collection
36
+ # (requires a patched Ruby interpreter).
37
+ # --replace-progname Replace $0 when loading the .rb files.
38
+ # --specialized-instruction Turn on specialized instruction.
39
+ # -h, --help Show help message
40
+ # --version Show version
41
+ # -v Show version, set $VERBOSE to true, run file
42
+ # -d Set $DEBUG to true
43
+ #
44
+ #
45
+ # See also: {flat profiles}[link:files/examples/flat_txt.html], {graph profiles}[link:files/examples/graph_txt.html], {html graph profiles}[link:files/examples/graph_html.html]
46
+ #
47
+
48
+ require 'ostruct'
49
+ require 'optparse'
50
+ require 'ruby-prof'
51
+
52
+ options = OpenStruct.new
53
+ options.measure_mode = RubyProf::PROCESS_TIME
54
+ options.printer = RubyProf::FlatPrinter
55
+ options.min_percent = 0
56
+ options.file = nil
57
+ options.replace_prog_name = false
58
+ options.specialized_instruction = false
59
+
60
+ opts = OptionParser.new do |opts|
61
+ opts.banner = "ruby_prof #{RubyProf::VERSION}\n" +
62
+ "Usage: ruby_prof [options] <script.rb> [--] [script-options]"
63
+
64
+ opts.separator ""
65
+ opts.separator "Options:"
66
+
67
+
68
+ opts.on('-p printer', '--printer=printer', [:flat, :flat_with_line_numbers, :graph, :graph_html, :call_tree, :call_stack, :dot],
69
+ 'Select a printer:',
70
+ ' flat - Prints a flat profile as text (default).',
71
+ ' flat_with_line_numbers - same as flat, with line numbers.',
72
+ ' graph - Prints a graph profile as text.',
73
+ ' graph_html - Prints a graph profile as html.',
74
+ ' call_tree - format for KCacheGrind',
75
+ ' call_stack - prints a HTML visualization of the call tree',
76
+ ' dot - Prints a graph profile as a dot file'
77
+ ) do |printer|
78
+
79
+
80
+ case printer
81
+ when :flat
82
+ options.printer = RubyProf::FlatPrinter
83
+ when :flat_with_line_numbers
84
+ options.printer = RubyProf::FlatPrinterWithLineNumbers
85
+ when :graph
86
+ options.printer = RubyProf::GraphPrinter
87
+ when :graph_html
88
+ options.printer = RubyProf::GraphHtmlPrinter
89
+ when :call_tree
90
+ options.printer = RubyProf::CallTreePrinter
91
+ when :call_stack
92
+ options.printer = RubyProf::CallStackPrinter
93
+ when :dot
94
+ options.printer = RubyProf::DotPrinter
95
+ end
96
+ end
97
+
98
+ opts.on('-m min_percent', '--min_percent=min_percent', Float,
99
+ 'The minimum percent a method must take before ',
100
+ ' being included in output reports.',
101
+ ' this option is not supported for call tree.') do |min_percent|
102
+ options.min_percent = min_percent
103
+ end
104
+
105
+ opts.on('-f path', '--file=path',
106
+ 'Output results to a file instead of standard out.') do |file|
107
+ options.file = file
108
+ options.old_wd = Dir.pwd
109
+ end
110
+
111
+ opts.on('--mode=measure_mode',
112
+ [:process, :wall, :cpu, :allocations, :memory, :gc_runs, :gc_time],
113
+ 'Select what ruby-prof should measure:',
114
+ ' process - Process time (default).',
115
+ ' wall - Wall time.',
116
+ ' cpu - CPU time (Pentium and PowerPCs only).',
117
+ ' allocations - Object allocations (requires patched Ruby interpreter).',
118
+ ' memory - Allocated memory in KB (requires patched Ruby interpreter).',
119
+ ' gc_runs - Number of garbage collections (requires patched Ruby interpreter).',
120
+ ' gc_time - Time spent in garbage collection (requires patched Ruby interpreter).') do |measure_mode|
121
+
122
+ case measure_mode
123
+ when :process
124
+ options.measure_mode = RubyProf::PROCESS_TIME
125
+ when :wall
126
+ options.measure_mode = RubyProf::WALL_TIME
127
+ when :cpu
128
+ options.measure_mode = RubyProf::CPU_TIME
129
+ when :allocations
130
+ options.measure_mode = RubyProf::ALLOCATIONS
131
+ when :memory
132
+ options.measure_mode = RubyProf::MEMORY
133
+ when :gc_runs
134
+ options.measure_mode = RubyProf::GC_RUNS
135
+ when :gc_time
136
+ options.measure_mode = RubyProf::GC_TIME
137
+ end
138
+ end
139
+
140
+ opts.on("--replace-progname", "Replace $0 when loading the .rb files.") do
141
+ options.replace_prog_name = true
142
+ end
143
+
144
+ if defined?(VM)
145
+ opts.on("--specialized-instruction", "Turn on specified instruction.") do
146
+ options.specialized_instruction = true
147
+ end
148
+ end
149
+
150
+ opts.on_tail("-h", "--help", "Show help message") do
151
+ puts opts
152
+ exit
153
+ end
154
+
155
+ opts.on_tail("--version", "Show version #{RubyProf::VERSION}") do
156
+ puts "ruby_prof " + RubyProf::VERSION
157
+ exit
158
+ end
159
+
160
+ opts.on("-v","Show version, set $VERBOSE to true, profile script") do
161
+ puts "ruby_prof " + RubyProf::VERSION
162
+ puts "ruby " + RUBY_DESCRIPTION
163
+ $VERBOSE= true
164
+ end
165
+
166
+ opts.on("-d", "Set $DEBUG to true") do
167
+ $DEBUG = true
168
+ end
169
+ end
170
+
171
+ begin
172
+ opts.parse! ARGV
173
+ rescue OptionParser::InvalidOption, OptionParser::InvalidArgument,
174
+ OptionParser::MissingArgument => e
175
+ puts opts
176
+ puts
177
+ puts e.message
178
+ exit(-1)
179
+ end
180
+
181
+ # Make sure the user specified at least one file
182
+ if ARGV.length < 1
183
+ puts opts
184
+ puts ""
185
+ puts "Must specify a script to run"
186
+ exit(-1)
187
+ end
188
+
189
+
190
+ # Install at_exit handler. It is important that we do this
191
+ # before loading the scripts so our at_exit handler run
192
+ # *after* any other one that will be installed.
193
+
194
+ at_exit {
195
+ # Stop profiling
196
+ result = RubyProf.stop
197
+
198
+ # Create a printer
199
+ printer = options.printer.new(result)
200
+
201
+ # Get output
202
+ if options.file
203
+ # write it relative to the dir they *started* in, as it's a bit surprising to write it in the dir they end up in.
204
+ Dir.chdir(options.old_wd) do
205
+ File.open(options.file, 'w') do |file|
206
+ printer.print(file, {:min_percent => options.min_percent})
207
+ end
208
+ end
209
+ else
210
+ # Print out results
211
+ printer.print(STDOUT, {:min_percent => options.min_percent})
212
+ end
213
+ }
214
+
215
+ # Now set measure mode
216
+ RubyProf.measure_mode = options.measure_mode
217
+
218
+ # Set VM compile option
219
+ if defined?(VM)
220
+ VM::InstructionSequence.compile_option = {
221
+ :trace_instruction => true,
222
+ :specialized_instruction => options.specialized_instruction
223
+ }
224
+ end
225
+
226
+ # Get the script we will execute
227
+ script = ARGV.shift
228
+ if options.replace_prog_name
229
+ $0 = File.expand_path(script)
230
+ end
231
+
232
+ # Start profiling
233
+ RubyProf.start
234
+
235
+ # Load the script
236
+ load script
Binary file
@@ -0,0 +1,55 @@
1
+ = Flat Profiles
2
+
3
+ Flat profiles show the total amount of time spent in each method.
4
+ As an example, here is the output from running printers_test.rb.
5
+
6
+ Thread ID: 21277412
7
+ %self cumulative total self children calls self/call total/call name
8
+ 46.34 4.06 8.72 4.06 4.66 501 0.01 0.02 Integer#upto
9
+ 23.89 6.16 2.09 2.09 0.00 61 0.03 0.03 Kernel.sleep
10
+ 15.12 7.48 1.33 1.33 0.00 250862 0.00 0.00 Fixnum#%
11
+ 14.13 8.72 1.24 1.24 0.00 250862 0.00 0.00 Fixnum#==
12
+ 0.18 8.74 0.02 0.02 0.00 1 0.02 0.02 Array#each_index
13
+ 0.17 8.75 6.64 0.01 6.63 500 0.00 0.01 Object#is_prime
14
+ 0.17 8.77 6.66 0.01 6.64 1 0.01 6.66 Array#select
15
+ 0.00 8.77 0.00 0.00 0.00 501 0.00 0.00 Fixnum#-
16
+ 0.00 8.77 0.00 0.00 0.00 1 0.00 0.00 Array#first
17
+ 0.00 8.77 0.00 0.00 0.00 1 0.00 0.00 Array#length
18
+ 0.00 8.77 0.00 0.00 0.00 1 0.00 0.00 Array#initialize
19
+ 0.00 8.77 8.77 0.00 8.77 1 0.00 8.77 Object#run_primes
20
+ 0.00 8.77 0.00 0.00 0.00 1 0.00 0.00 Integer#to_int
21
+ 0.00 8.77 6.66 0.00 6.66 1 0.00 6.66 Object#find_primes
22
+ 0.00 8.77 2.09 0.00 2.09 1 0.00 2.09 Object#find_largest
23
+ 0.00 8.77 0.02 0.00 0.02 1 0.00 0.02 Object#make_random_array
24
+ 0.00 8.77 0.00 0.00 0.00 1 0.00 0.00 Class#new
25
+ 0.00 8.77 0.00 0.00 0.00 500 0.00 0.00 Array#[]=
26
+ 0.00 8.77 0.00 0.00 0.00 61 0.00 0.00 Fixnum#>
27
+ 0.00 8.77 0.00 0.00 0.00 61 0.00 0.00 Array#[]
28
+ 0.00 8.77 8.77 0.00 8.77 1 0.00 8.77 #toplevel
29
+ 0.00 8.77 0.00 0.00 0.00 500 0.00 0.00 Kernel.rand
30
+
31
+ All values are in seconds.
32
+
33
+ The columns are:
34
+
35
+ %self - The percentage of time spent in this method, derived from self_time/total_time
36
+ cumulative - The sum of the time spent in this method and all the methods listed above it.
37
+ total - The time spent in this method and its children.
38
+ self - The time spent in this method.
39
+ children - The time spent in this method's children.
40
+ calls - The number of times this method was called.
41
+ self/call - The average time spent per call in this method.
42
+ total/call - The average time spent per call in this method and its children.
43
+ name - The name of the method.
44
+
45
+ Methods are sorted based on %self, therefore the methods that execute the longest are listed
46
+ first.
47
+
48
+ The interpretation of method names is:
49
+ * #toplevel - The root method that calls all other methods
50
+ * MyObject#test - An instance method "test" of the class "MyObject"
51
+ * <Object:MyObject>#test - The <> characters indicate a singleton method on a singleton class.
52
+
53
+ For example, wee can see that Integer#upto took the most time, 4.06 seconds. An additional
54
+ 4.66 seconds were spent in its children, for a total time of 8.72 seconds.
55
+
@@ -0,0 +1,106 @@
1
+ digraph "Profile" {
2
+ label="WALL_TIME >=0%\nTotal: 1.382985";
3
+ labelloc=t;
4
+ labeljust=l;
5
+ subgraph "Thread 2148237740" {
6
+ 2159427600 [label="[]=\n(0%)"];
7
+ 2159427680 [label="%\n(15%)"];
8
+ 2159427760 [label="run_primes\n(100%)"];
9
+ 2159427760 -> 2159428600 [label="2/2" fontsize=10 fontcolor="#666666"];
10
+ 2159427760 -> 2159428300 [label="2/2" fontsize=10 fontcolor="#666666"];
11
+ 2159427840 [label="new\n(0%)"];
12
+ 2159427840 -> 2159428080 [label="2/2" fontsize=10 fontcolor="#666666"];
13
+ 2159427840 -> 2159428760 [label="2/2" fontsize=10 fontcolor="#666666"];
14
+ 2159427920 [label="rand\n(0%)"];
15
+ 2159428000 [label="-\n(0%)"];
16
+ 2159428080 [label="initialize\n(0%)"];
17
+ 2159428160 [label="each_index\n(1%)"];
18
+ 2159428160 -> 2159427920 [label="20000/20000" fontsize=10 fontcolor="#666666"];
19
+ 2159428160 -> 2159427600 [label="20000/20000" fontsize=10 fontcolor="#666666"];
20
+ 2159428220 [label="go\n(49%)"];
21
+ 2159428220 -> 2159427760 [label="1/2" fontsize=10 fontcolor="#666666"];
22
+ 2159428300 [label="make_random_array\n(1%)"];
23
+ 2159428300 -> 2159428160 [label="2/2" fontsize=10 fontcolor="#666666"];
24
+ 2159428300 -> 2159427840 [label="2/2" fontsize=10 fontcolor="#666666"];
25
+ 2159428360 [label="setup\n(100%)"];
26
+ 2159428360 -> 2159427760 [label="1/2" fontsize=10 fontcolor="#666666"];
27
+ 2159428360 -> 2159428220 [label="1/1" fontsize=10 fontcolor="#666666"];
28
+ 2159428440 [label="select\n(99%)"];
29
+ 2159428440 -> 2159428520 [label="20000/20000" fontsize=10 fontcolor="#666666"];
30
+ 2159428520 [label="is_prime\n(98%)"];
31
+ 2159428520 -> 2159428680 [label="20000/20000" fontsize=10 fontcolor="#666666"];
32
+ 2159428520 -> 2159428000 [label="20000/20000" fontsize=10 fontcolor="#666666"];
33
+ 2159428600 [label="find_primes\n(99%)"];
34
+ 2159428600 -> 2159428440 [label="2/2" fontsize=10 fontcolor="#666666"];
35
+ 2159428680 [label="upto\n(97%)"];
36
+ 2159428680 -> 2159427680 [label="1562487/1562487" fontsize=10 fontcolor="#666666"];
37
+ 2159428680 -> 2159428920 [label="1562487/1562487" fontsize=10 fontcolor="#666666"];
38
+ 2159428760 [label="allocate\n(0%)"];
39
+ 2159428920 [label="==\n(12%)"];
40
+ }
41
+ subgraph cluster_2159103200 {
42
+ label = "Object";
43
+ fontcolor = "#666666";
44
+ fontsize = 16;
45
+ color = "#666666";
46
+ 2159428600;
47
+ 2159428520;
48
+ 2159428300;
49
+ 2159427760;
50
+ }
51
+ subgraph cluster_2159103260 {
52
+ label = "Integer";
53
+ fontcolor = "#666666";
54
+ fontsize = 16;
55
+ color = "#666666";
56
+ 2159428680;
57
+ }
58
+ subgraph cluster_2159103060 {
59
+ label = "PrintersTest";
60
+ fontcolor = "#666666";
61
+ fontsize = 16;
62
+ color = "#666666";
63
+ 2159428360;
64
+ 2159428220;
65
+ }
66
+ subgraph cluster_2159103120 {
67
+ label = "Array";
68
+ fontcolor = "#666666";
69
+ fontsize = 16;
70
+ color = "#666666";
71
+ 2159428440;
72
+ 2159428160;
73
+ 2159428080;
74
+ 2159427600;
75
+ }
76
+ subgraph cluster_2159103340 {
77
+ label = "<Class::Array>";
78
+ fontcolor = "#666666";
79
+ fontsize = 16;
80
+ color = "#666666";
81
+ 2159428760;
82
+ }
83
+ subgraph cluster_2159102840 {
84
+ label = "Class";
85
+ fontcolor = "#666666";
86
+ fontsize = 16;
87
+ color = "#666666";
88
+ 2159427840;
89
+ }
90
+ subgraph cluster_2159102980 {
91
+ label = "Kernel";
92
+ fontcolor = "#666666";
93
+ fontsize = 16;
94
+ color = "#666666";
95
+ 2159427920;
96
+ }
97
+ subgraph cluster_2159103400 {
98
+ label = "Fixnum";
99
+ fontcolor = "#666666";
100
+ fontsize = 16;
101
+ color = "#666666";
102
+ 2159428920;
103
+ 2159428000;
104
+ 2159427680;
105
+ }
106
+ }