ruby-prof 0.8.1-x86-mingw32 → 0.11.0.rc1-x86-mingw32

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 (119) hide show
  1. data/CHANGES +89 -13
  2. data/LICENSE +4 -3
  3. data/{README → README.rdoc} +155 -162
  4. data/Rakefile +50 -123
  5. data/bin/ruby-prof +86 -47
  6. data/examples/empty.png +0 -0
  7. data/examples/graph.dot +106 -0
  8. data/examples/graph.png +0 -0
  9. data/examples/minus.png +0 -0
  10. data/examples/multi.flat.txt +23 -0
  11. data/examples/multi.graph.html +906 -0
  12. data/examples/multi.grind.dat +194 -0
  13. data/examples/multi.stack.html +573 -0
  14. data/examples/plus.png +0 -0
  15. data/examples/stack.html +573 -0
  16. data/ext/ruby_prof/extconf.rb +53 -0
  17. data/ext/ruby_prof/rp_call_info.c +369 -0
  18. data/ext/ruby_prof/rp_call_info.h +46 -0
  19. data/ext/ruby_prof/rp_measure.c +48 -0
  20. data/ext/ruby_prof/rp_measure.h +45 -0
  21. data/ext/ruby_prof/rp_measure_allocations.c +86 -0
  22. data/ext/ruby_prof/rp_measure_cpu_time.c +112 -0
  23. data/ext/ruby_prof/rp_measure_gc_runs.c +87 -0
  24. data/ext/ruby_prof/rp_measure_gc_time.c +73 -0
  25. data/ext/ruby_prof/rp_measure_memory.c +81 -0
  26. data/ext/ruby_prof/rp_measure_process_time.c +71 -0
  27. data/ext/ruby_prof/rp_measure_wall_time.c +42 -0
  28. data/ext/ruby_prof/rp_method.c +363 -0
  29. data/ext/ruby_prof/rp_method.h +55 -0
  30. data/ext/ruby_prof/rp_stack.c +61 -0
  31. data/ext/ruby_prof/rp_stack.h +40 -0
  32. data/ext/ruby_prof/rp_thread.c +113 -0
  33. data/ext/ruby_prof/rp_thread.h +20 -0
  34. data/ext/ruby_prof/ruby_prof.c +332 -1377
  35. data/ext/ruby_prof/ruby_prof.h +54 -188
  36. data/ext/ruby_prof/version.h +6 -3
  37. data/lib/1.8/ruby_prof.so +0 -0
  38. data/lib/1.9/ruby_prof.exp +0 -0
  39. data/lib/1.9/ruby_prof.ilk +0 -0
  40. data/lib/1.9/ruby_prof.lib +0 -0
  41. data/lib/1.9/ruby_prof.pdb +0 -0
  42. data/lib/1.9/ruby_prof.so +0 -0
  43. data/lib/ruby-prof.rb +32 -18
  44. data/lib/ruby-prof/abstract_printer.rb +15 -5
  45. data/lib/ruby-prof/aggregate_call_info.rb +11 -3
  46. data/lib/ruby-prof/call_info.rb +68 -1
  47. data/lib/ruby-prof/call_stack_printer.rb +775 -0
  48. data/lib/ruby-prof/call_tree_printer.rb +17 -9
  49. data/lib/ruby-prof/compatibility.rb +134 -0
  50. data/lib/ruby-prof/dot_printer.rb +152 -0
  51. data/lib/ruby-prof/empty.png +0 -0
  52. data/lib/ruby-prof/flat_printer.rb +23 -24
  53. data/lib/ruby-prof/flat_printer_with_line_numbers.rb +17 -21
  54. data/lib/ruby-prof/graph_html_printer.rb +69 -39
  55. data/lib/ruby-prof/graph_printer.rb +35 -35
  56. data/lib/ruby-prof/method_info.rb +26 -4
  57. data/lib/ruby-prof/minus.png +0 -0
  58. data/lib/ruby-prof/multi_printer.rb +56 -0
  59. data/lib/ruby-prof/plus.png +0 -0
  60. data/lib/ruby-prof/profile.rb +72 -0
  61. data/lib/ruby-prof/rack.rb +31 -0
  62. data/lib/ruby-prof/symbol_to_proc.rb +3 -1
  63. data/lib/ruby-prof/task.rb +20 -19
  64. data/lib/ruby-prof/test.rb +5 -3
  65. data/lib/ruby_prof.exp +0 -0
  66. data/lib/ruby_prof.ilk +0 -0
  67. data/lib/ruby_prof.lib +0 -0
  68. data/lib/ruby_prof.pdb +0 -0
  69. data/lib/ruby_prof.so +0 -0
  70. data/lib/unprof.rb +2 -0
  71. data/test/aggregate_test.rb +29 -14
  72. data/test/basic_test.rb +3 -251
  73. data/test/bug_test.rb +6 -0
  74. data/test/duplicate_names_test.rb +4 -4
  75. data/test/dynamic_method_test.rb +61 -0
  76. data/test/enumerable_test.rb +4 -4
  77. data/test/exceptions_test.rb +6 -5
  78. data/test/exclude_threads_test.rb +47 -47
  79. data/test/exec_test.rb +5 -5
  80. data/test/line_number_test.rb +16 -16
  81. data/test/measure_allocations_test.rb +25 -0
  82. data/test/measure_cpu_time_test.rb +212 -0
  83. data/test/measure_gc_runs_test.rb +29 -0
  84. data/test/measure_gc_time_test.rb +29 -0
  85. data/test/measure_memory_test.rb +36 -0
  86. data/test/measure_process_time_test.rb +205 -0
  87. data/test/measure_wall_time_test.rb +209 -0
  88. data/test/method_elimination_test.rb +74 -0
  89. data/test/module_test.rb +12 -21
  90. data/test/multi_printer_test.rb +81 -0
  91. data/test/no_method_class_test.rb +5 -3
  92. data/test/prime.rb +7 -10
  93. data/test/prime_test.rb +3 -3
  94. data/test/printers_test.rb +180 -54
  95. data/test/recursive_test.rb +34 -72
  96. data/test/singleton_test.rb +5 -4
  97. data/test/stack_printer_test.rb +73 -0
  98. data/test/stack_test.rb +7 -7
  99. data/test/start_stop_test.rb +23 -6
  100. data/test/test_helper.rb +81 -0
  101. data/test/test_suite.rb +35 -21
  102. data/test/thread_test.rb +40 -39
  103. data/test/unique_call_path_test.rb +6 -6
  104. metadata +106 -51
  105. data/ext/ruby_prof/measure_allocations.h +0 -58
  106. data/ext/ruby_prof/measure_cpu_time.h +0 -152
  107. data/ext/ruby_prof/measure_gc_runs.h +0 -76
  108. data/ext/ruby_prof/measure_gc_time.h +0 -57
  109. data/ext/ruby_prof/measure_memory.h +0 -101
  110. data/ext/ruby_prof/measure_process_time.h +0 -52
  111. data/ext/ruby_prof/measure_wall_time.h +0 -53
  112. data/ext/ruby_prof/mingw/Rakefile +0 -23
  113. data/ext/ruby_prof/mingw/build.rake +0 -38
  114. data/rails/environment/profile.rb +0 -24
  115. data/rails/example/example_test.rb +0 -9
  116. data/rails/profile_test_helper.rb +0 -21
  117. data/test/current_failures_windows +0 -8
  118. data/test/measurement_test.rb +0 -121
  119. data/test/ruby-prof-bin +0 -20
data/Rakefile CHANGED
@@ -1,99 +1,67 @@
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',
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 = "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"
53
- spec.email = "shugo@ruby-lang.org, cfis@savagexi.com, rogerdpack@gmail.com"
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
- require 'rake/extensiontask'
70
-
71
- desc 'build native .gem files -- use like native_gems clobber cross native gem RUBY_CC_VERSION=1.8.6:1.9.1--for non native use native_gems clobber && clean gem'
72
- task :native_gems do
73
- Rake::ExtensionTask.new('ruby_prof', default_spec) do |ext|
74
- ext.cross_compile = true
75
- ext.cross_platform = ['x86-mswin32', 'i386-mingw32']
76
- end
1
+ # encoding: utf-8
2
+
3
+ require "rubygems/package_task"
4
+ require "rake/extensiontask"
5
+ require "rake/testtask"
6
+ require "rdoc/task"
7
+ require "date"
8
+
9
+ # To release a version of ruby-prof:
10
+ # * Update version.h
11
+ # * Update CHANGES
12
+ # * Update rdocs
13
+ # * git commit to commit files
14
+ # * rake clobber to remove extra files
15
+ # * rake compile to build windows gems
16
+ # * rake package to create the gems
17
+ # * Tag the release in git (tag 0.10.1)
18
+ # * Push to ruybgems.org (gem push pkg/<gem files>)
19
+
20
+ GEM_NAME = 'ruby-prof'
21
+ SO_NAME = 'ruby_prof'
22
+
23
+ default_spec = Gem::Specification.load("#{GEM_NAME}.gemspec")
24
+
25
+ Rake::ExtensionTask.new do |ext|
26
+ ext.gem_spec = default_spec
27
+ ext.name = SO_NAME
28
+ ext.ext_dir = "ext/#{SO_NAME}"
29
+ ext.lib_dir = "lib/#{RUBY_VERSION.sub(/\.\d$/, '')}"
30
+ ext.cross_compile = true
31
+ ext.cross_platform = ['x86-mswin32-60', 'x86-mingw32-60']
77
32
  end
78
33
 
79
34
  # Rake task to build the default package
80
- Rake::GemPackageTask.new(default_spec) do |pkg|
35
+ Gem::PackageTask.new(default_spec) do |pkg|
81
36
  pkg.need_tar = true
82
- #pkg.need_zip = true
83
37
  end
84
38
 
39
+ # Setup Windows Gem
40
+ if RUBY_PLATFORM.match(/win32|mingw32/)
41
+ # Windows specification
42
+ win_spec = default_spec.clone
43
+ win_spec.platform = Gem::Platform::CURRENT
44
+ win_spec.files += Dir.glob('lib/**/*.so')
45
+ win_spec.instance_variable_set(:@cache_file, nil) # Hack to work around gem issue
85
46
 
47
+ # Unset extensions
48
+ win_spec.extensions = nil
86
49
 
50
+ # Rake task to build the windows package
51
+ Gem::PackageTask.new(win_spec) do |pkg|
52
+ pkg.need_tar = false
53
+ end
54
+ end
87
55
 
88
56
  # --------- RDoc Documentation ------
89
57
  desc "Generate rdoc documentation"
90
- Rake::RDocTask.new("rdoc") do |rdoc|
58
+ RDoc::Task.new("rdoc") do |rdoc|
91
59
  rdoc.rdoc_dir = 'doc'
92
60
  rdoc.title = "ruby-prof"
93
61
  # Show source inline with line numbers
94
62
  rdoc.options << "--inline-source" << "--line-numbers"
95
63
  # Make the readme file the start page for the generated html
96
- rdoc.options << '--main' << 'README'
64
+ rdoc.options << '--main' << 'README.rdoc'
97
65
  rdoc.rdoc_files.include('bin/**/*',
98
66
  'doc/*.rdoc',
99
67
  'examples/flat.txt',
@@ -103,7 +71,7 @@ Rake::RDocTask.new("rdoc") do |rdoc|
103
71
  'ext/ruby_prof/ruby_prof.c',
104
72
  'ext/ruby_prof/version.h',
105
73
  'ext/ruby_prof/measure_*.h',
106
- 'README',
74
+ 'README.rdoc',
107
75
  'LICENSE')
108
76
  end
109
77
 
@@ -115,45 +83,4 @@ Rake::TestTask.new do |t|
115
83
  t.test_files = Dir['test/test_suite.rb']
116
84
  t.verbose = true
117
85
  t.warning = true
118
- end
119
-
120
- require 'fileutils'
121
-
122
- desc 'Buildr ruby_prof.so'
123
- task :build do
124
- build(false)
125
- end
126
-
127
- def build(with_debug)
128
- Dir.chdir('ext/ruby_prof') do
129
- unless File.exist? 'Makefile'
130
- if with_debug
131
- system(Gem.ruby + " -d extconf.rb")
132
- else
133
- system(Gem.ruby + " extconf.rb")
134
- end
135
- system("make clean")
136
- end
137
- system("make")
138
- FileUtils.cp 'ruby_prof.so', '../../lib'
139
- end
140
- end
141
-
142
- desc 'build ruby_prof.so with verbose debugging enabled'
143
- task :build_debug do
144
- build(true)
145
- end
146
-
147
- task :cleanr do
148
- FileUtils.rm 'lib/ruby_prof.so' if File.exist? 'lib/ruby_prof.so'
149
- Dir.chdir('ext/ruby_prof') do
150
- if File.exist? 'Makefile'
151
- system("make clean")
152
- FileUtils.rm 'Makefile'
153
- end
154
- Dir.glob('*~') do |file|
155
- FileUtils.rm file
156
- end
157
- end
158
- system("rm -rf pkg")
159
- end
86
+ end
data/bin/ruby-prof CHANGED
@@ -8,44 +8,14 @@
8
8
  #
9
9
  # ruby_prof [options] <script.rb> [--] [script-options]"
10
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
- # -f, --file=path Output results to a file instead of standard out.
19
- # -m, --min_percent=min_percent The minimum percent a method must take before ',
20
- # being included in output reports. Should be an
21
- # integer between 1 and 100. 0 means all methods are printed.
22
- # --mode=measure_mode Select a measurement mode:
23
- # process - Use process time (default).
24
- # wall - Use wall time.
25
- # cpu - Use the CPU clock counter
26
- # (only supported on Pentium and PowerPCs).
27
- # allocations - Tracks object allocations
28
- # (requires a patched Ruby interpreter).
29
- # memory - Tracks total memory size
30
- # (requires a patched Ruby interpreter).
31
- # gc_runs - Tracks number of garbage collection runs
32
- # (requires a patched Ruby interpreter).
33
- # gc_time - Tracks time spent doing garbage collection
34
- # (requires a patched Ruby interpreter).
35
- # --replace-progname Replace $0 when loading the .rb files.
36
- # --specialized-instruction Turn on specialized instruction.
37
- # -h, --help Show help message
38
- # --version Show version
39
- # -v Show version, set $VERBOSE to true, run file
40
- # -d Set $DEBUG to true
41
- #
42
- #
43
- # 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]
11
+ # Various options:
12
+ # run "$ ruby-prof --help" to see them
44
13
  #
14
+ # See also the readme "reports" section for the various outputs
45
15
 
46
16
  require 'ostruct'
47
17
  require 'optparse'
48
- require 'ruby-prof'
18
+ require File.expand_path('../../lib/ruby-prof', __FILE__)
49
19
 
50
20
  options = OpenStruct.new
51
21
  options.measure_mode = RubyProf::PROCESS_TIME
@@ -57,19 +27,21 @@ options.specialized_instruction = false
57
27
 
58
28
  opts = OptionParser.new do |opts|
59
29
  opts.banner = "ruby_prof #{RubyProf::VERSION}\n" +
60
- "Usage: ruby_prof [options] <script.rb> [--] [script-options]"
30
+ "Usage: ruby-prof [options] <script.rb> [--] [profiled-script-command-line-options]"
61
31
 
62
32
  opts.separator ""
63
33
  opts.separator "Options:"
64
34
 
65
35
 
66
- opts.on('-p printer', '--printer=printer', [:flat, :flat_with_line_numbers, :graph, :graph_html, :call_tree],
36
+ opts.on('-p printer', '--printer=printer', [:flat, :flat_with_line_numbers, :graph, :graph_html, :call_tree, :call_stack, :dot],
67
37
  'Select a printer:',
68
38
  ' flat - Prints a flat profile as text (default).',
69
39
  ' flat_with_line_numbers - same as flat, with line numbers.',
70
40
  ' graph - Prints a graph profile as text.',
71
41
  ' graph_html - Prints a graph profile as html.',
72
- ' call_tree - format for KCacheGrind'
42
+ ' call_tree - format for KCacheGrind',
43
+ ' call_stack - prints a HTML visualization of the call tree',
44
+ ' dot - Prints a graph profile as a dot file'
73
45
  ) do |printer|
74
46
 
75
47
 
@@ -84,6 +56,10 @@ opts = OptionParser.new do |opts|
84
56
  options.printer = RubyProf::GraphHtmlPrinter
85
57
  when :call_tree
86
58
  options.printer = RubyProf::CallTreePrinter
59
+ when :call_stack
60
+ options.printer = RubyProf::CallStackPrinter
61
+ when :dot
62
+ options.printer = RubyProf::DotPrinter
87
63
  end
88
64
  end
89
65
 
@@ -97,6 +73,7 @@ opts = OptionParser.new do |opts|
97
73
  opts.on('-f path', '--file=path',
98
74
  'Output results to a file instead of standard out.') do |file|
99
75
  options.file = file
76
+ options.old_wd = Dir.pwd
100
77
  end
101
78
 
102
79
  opts.on('--mode=measure_mode',
@@ -127,7 +104,26 @@ opts = OptionParser.new do |opts|
127
104
  options.measure_mode = RubyProf::GC_TIME
128
105
  end
129
106
  end
130
-
107
+
108
+ opts.on('-s sort_mode', '--sort=sort_mode', [:total, :self, :wait, :child],
109
+ 'Select how ruby-prof results should be sorted:',
110
+ ' total - Total time',
111
+ ' self - Self time',
112
+ ' wait - Wait time',
113
+ ' child - Child time') do |sort_mode|
114
+
115
+ options.sort_method = case sort_mode
116
+ when :total
117
+ :total_time
118
+ when :self
119
+ :self_time
120
+ when :wait
121
+ :wait_time
122
+ when :child
123
+ :children_time
124
+ end
125
+ end
126
+
131
127
  opts.on("--replace-progname", "Replace $0 when loading the .rb files.") do
132
128
  options.replace_prog_name = true
133
129
  end
@@ -148,15 +144,34 @@ opts = OptionParser.new do |opts|
148
144
  exit
149
145
  end
150
146
 
151
- opts.on("-v","Show version, set $VERBOSE to true, profile script") do
152
- puts "ruby_prof " + RubyProf::VERSION
153
- puts "ruby " + RUBY_DESCRIPTION
154
- $VERBOSE= true
147
+ opts.on("-v","Show version, set $VERBOSE to true, profile script if option given") do
148
+ puts "ruby version: " + [RUBY_PATCHLEVEL, RUBY_PLATFORM, RUBY_VERSION].join(' ')
149
+ $VERBOSE = true
155
150
  end
156
151
 
157
152
  opts.on("-d", "Set $DEBUG to true") do
158
153
  $DEBUG = true
159
154
  end
155
+
156
+ opts.on('-R lib', '--require-noprof lib', 'require a specific library (not profiled)') do |lib|
157
+ options.pre_libs ||= []
158
+ options.pre_libs << lib
159
+ end
160
+
161
+ opts.on('-E code', '--eval-noprof code', 'execute the ruby statements (not profiled)') do |code|
162
+ options.pre_exec ||= []
163
+ options.pre_exec << code
164
+ end
165
+
166
+ opts.on('-r lib', '--require lib', 'require a specific library') do |lib|
167
+ options.libs ||= []
168
+ options.libs << lib
169
+ end
170
+
171
+ opts.on('-e code', '--eval', 'execute the ruby statements') do |code|
172
+ options.exec ||= []
173
+ options.exec << code
174
+ end
160
175
  end
161
176
 
162
177
  begin
@@ -170,7 +185,7 @@ rescue OptionParser::InvalidOption, OptionParser::InvalidArgument,
170
185
  end
171
186
 
172
187
  # Make sure the user specified at least one file
173
- if ARGV.length < 1
188
+ if ARGV.length < 1 and not options.exec
174
189
  puts opts
175
190
  puts ""
176
191
  puts "Must specify a script to run"
@@ -188,15 +203,19 @@ at_exit {
188
203
 
189
204
  # Create a printer
190
205
  printer = options.printer.new(result)
206
+ printer_options = {:min_percent => options.min_percent, :sort_method => options.sort_method}
191
207
 
192
208
  # Get output
193
209
  if options.file
194
- File.open(options.file, 'w') do |file|
195
- printer.print(file, {:min_percent => options.min_percent})
210
+ # 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.
211
+ Dir.chdir(options.old_wd) do
212
+ File.open(options.file, 'w') do |file|
213
+ printer.print(file, printer_options)
214
+ end
196
215
  end
197
216
  else
198
217
  # Print out results
199
- printer.print(STDOUT, {:min_percent => options.min_percent})
218
+ printer.print(STDOUT, printer_options)
200
219
  end
201
220
  }
202
221
 
@@ -217,8 +236,28 @@ if options.replace_prog_name
217
236
  $0 = File.expand_path(script)
218
237
  end
219
238
 
239
+ if options.pre_libs
240
+ options.pre_libs.each { |l| require l }
241
+ end
242
+
243
+ if options.pre_exec
244
+ options.pre_exec.each { |c| eval c }
245
+ end
246
+
247
+ # do not pollute profiling report with OpenStruct#libs
248
+ ol = options.libs
249
+ oe = options.exec
250
+
220
251
  # Start profiling
221
252
  RubyProf.start
222
253
 
254
+ if ol
255
+ ol.each { |l| require l }
256
+ end
257
+
258
+ if oe
259
+ oe.each { |c| eval c }
260
+ end
261
+
223
262
  # Load the script
224
- load script
263
+ load script if script
Binary file
@@ -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
+ }