ruby-prof 0.11.2-x86-mingw32 → 0.12.1-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 (66) hide show
  1. data/CHANGES +27 -0
  2. data/README.rdoc +15 -15
  3. data/Rakefile +5 -0
  4. data/bin/ruby-prof +274 -265
  5. data/ext/ruby_prof/rp_call_info.c +33 -24
  6. data/ext/ruby_prof/rp_call_info.h +2 -1
  7. data/ext/ruby_prof/rp_measure.c +1 -1
  8. data/ext/ruby_prof/rp_measure.h +1 -1
  9. data/ext/ruby_prof/rp_measure_allocations.c +1 -1
  10. data/ext/ruby_prof/rp_measure_cpu_time.c +1 -1
  11. data/ext/ruby_prof/rp_measure_gc_runs.c +1 -1
  12. data/ext/ruby_prof/rp_measure_gc_time.c +1 -1
  13. data/ext/ruby_prof/rp_measure_memory.c +1 -1
  14. data/ext/ruby_prof/rp_measure_process_time.c +2 -2
  15. data/ext/ruby_prof/rp_measure_wall_time.c +2 -2
  16. data/ext/ruby_prof/rp_method.c +11 -24
  17. data/ext/ruby_prof/rp_method.h +2 -3
  18. data/ext/ruby_prof/rp_stack.c +55 -14
  19. data/ext/ruby_prof/rp_stack.h +10 -10
  20. data/ext/ruby_prof/rp_thread.c +30 -21
  21. data/ext/ruby_prof/rp_thread.h +3 -3
  22. data/ext/ruby_prof/ruby_prof.c +9 -88
  23. data/ext/ruby_prof/ruby_prof.h +1 -1
  24. data/ext/ruby_prof/vc/ruby_prof.sln +12 -6
  25. data/ext/ruby_prof/vc/ruby_prof_18.vcxproj +2 -0
  26. data/ext/ruby_prof/vc/{ruby_prof.vcxproj → ruby_prof_19.vcxproj} +4 -1
  27. data/ext/ruby_prof/vc/ruby_prof_20.vcxproj +112 -0
  28. data/ext/ruby_prof/version.h +4 -4
  29. data/lib/1.8/ruby_prof.so +0 -0
  30. data/lib/1.9/ruby_prof.so +0 -0
  31. data/lib/2.0/ruby_prof.so +0 -0
  32. data/lib/ruby-prof.rb +1 -0
  33. data/lib/ruby-prof/call_info.rb +1 -1
  34. data/lib/ruby-prof/call_info_visitor.rb +4 -2
  35. data/lib/ruby-prof/compatibility.rb +13 -3
  36. data/lib/ruby-prof/method_info.rb +1 -1
  37. data/lib/ruby-prof/printers/call_info_printer.rb +1 -1
  38. data/lib/ruby-prof/printers/call_stack_printer.rb +3 -3
  39. data/lib/ruby-prof/printers/dot_printer.rb +2 -2
  40. data/lib/ruby-prof/printers/flat_printer.rb +4 -4
  41. data/lib/ruby-prof/printers/flat_printer_with_line_numbers.rb +2 -2
  42. data/lib/ruby-prof/printers/graph_html_printer.rb +3 -4
  43. data/lib/ruby-prof/printers/graph_printer.rb +15 -15
  44. data/lib/ruby-prof/profile.rb +1 -1
  45. data/lib/ruby-prof/rack.rb +0 -5
  46. data/lib/ruby-prof/thread.rb +22 -0
  47. data/ruby-prof.gemspec +2 -1
  48. data/test/basic_test.rb +77 -45
  49. data/test/call_info_test.rb +78 -0
  50. data/test/call_info_visitor_test.rb +1 -1
  51. data/test/dynamic_method_test.rb +14 -8
  52. data/test/measure_cpu_time_test.rb +23 -12
  53. data/test/measure_process_time_test.rb +21 -170
  54. data/test/measure_wall_time_test.rb +59 -13
  55. data/test/method_elimination_test.rb +30 -19
  56. data/test/pause_resume_test.rb +129 -22
  57. data/test/prime.rb +1 -2
  58. data/test/printers_test.rb +8 -17
  59. data/test/recursive_test.rb +6 -50
  60. data/test/test_helper.rb +30 -10
  61. data/test/test_suite.rb +1 -2
  62. metadata +23 -7
  63. data/test/bug_test.rb +0 -6
  64. data/test/gc_test.rb +0 -35
  65. data/test/pause_test.rb +0 -57
  66. data/test/prime_test.rb +0 -13
data/CHANGES CHANGED
@@ -1,3 +1,30 @@
1
+ 0.12.1 (2013-01-19)
2
+ ======================
3
+ * Add back in pause/resume support since Rails uses it
4
+
5
+ 0.12.0 (2013-01-06)
6
+ ======================
7
+ * Ruby 2.0.0 support (Charlie Savage)
8
+ * Fix issue where profiling results could exceed 100% if profile code had multiple top level methods (Charlie Savage)
9
+ * Replaced RubyProf::Thread#top_method with RubyProf::Thread#top_methods (Charlie Savage)
10
+ * Added RubyProf::Thread#total_time (Charlie Savage)
11
+ * Remove the -r and -e command line options. If you need specific libraries or code profiled then add them
12
+ to your code (Charlie Savage).
13
+ * Rewrite ruby-prof script to be more self-contained (Gary Weaver)
14
+ * Fix list formatting in readme (Thilo Rusche)
15
+ * Remove pause/resume support since its buggy and complicates the code
16
+
17
+ 0.11.3 (2012-12-27)
18
+ ======================
19
+ * Prefix c functions with prof_ to avoid name conflicts (Kenta Murata)
20
+ * Update ruby-prof script to avoid seg faults (Gary Weaver)
21
+ * Rakefile updates (Roger Pack)
22
+ * Fix regexp file reading (Gilbert Roulot)
23
+ * Update documentation (Timo Schilling)
24
+ * Fix up ruby warnings (Mike Gehard)
25
+ * Remove duplicate code (Chas Lemley)
26
+
27
+
1
28
  0.11.2 (2012-05-06)
2
29
  ======================
3
30
  * Fix compile issue with BOOL. Should be _Bool for C99.
data/README.rdoc CHANGED
@@ -15,7 +15,7 @@ ruby-prof is a fast code profiler for Ruby. Its features include:
15
15
 
16
16
  == Requirements
17
17
 
18
- ruby-prof requires Ruby 1.8.7 or 1.9.1 and higher.
18
+ ruby-prof requires Ruby 1.8.7 or 1.9.2 and higher.
19
19
 
20
20
  If you are running Linux or Unix you'll need a C compiler so the extension
21
21
  can be compiled when it is installed.
@@ -186,29 +186,29 @@ profile.rb.
186
186
  So to profile Rails:
187
187
 
188
188
  1. Create a new profile.rb environment. Make sure to turn on cache_classes
189
- and cache_template_loading. Otherwise your profiling results will be
190
- overwhelemed by the time Rails spends loading required files. You should
191
- likely turn off caching.
189
+ and cache_template_loading. Otherwise your profiling results will be
190
+ overwhelemed by the time Rails spends loading required files. You should
191
+ likely turn off caching.
192
192
 
193
193
  2. Add the ruby-prof to your gemfile:
194
194
 
195
- group :profile do
196
- gem 'ruby-prof'
197
- end
195
+ group :profile do
196
+ gem 'ruby-prof'
197
+ end
198
198
 
199
199
  3. Add the ruby prof rack adapter to your middleware stack. One way to
200
- do this is by adding the following code to config.ru:
200
+ do this is by adding the following code to config.ru:
201
201
 
202
- if Rails.env.profile?
203
- use Rack::RubyProf, :path => '/temp/profile'
204
- end
202
+ if Rails.env.profile?
203
+ use Rack::RubyProf, :path => '/temp/profile'
204
+ end
205
205
 
206
- The path is where you want profiling results to be stored. By default the
207
- rack adapter will generate a html call graph report and flat text report.
206
+ The path is where you want profiling results to be stored. By default the
207
+ rack adapter will generate a html call graph report and flat text report.
208
208
 
209
209
  4. Now make a request to your running server. New profiling information will
210
- be generated for each request. Note that each request will overwrite
211
- the profiling reports created by the previous request!
210
+ be generated for each request. Note that each request will overwrite
211
+ the profiling reports created by the previous request!
212
212
 
213
213
  == Reports
214
214
 
data/Rakefile CHANGED
@@ -5,6 +5,7 @@ require "rake/extensiontask"
5
5
  require "rake/testtask"
6
6
  require "rdoc/task"
7
7
  require "date"
8
+ require 'rake/clean'
8
9
 
9
10
  # To release a version of ruby-prof:
10
11
  # * Update version.h
@@ -78,6 +79,10 @@ end
78
79
 
79
80
  task :default => :package
80
81
 
82
+ for file in Dir['**/*.so']
83
+ CLEAN.include file
84
+ end
85
+
81
86
  desc 'Run the ruby-prof test suite'
82
87
  Rake::TestTask.new do |t|
83
88
  t.libs += %w(lib ext test)
data/bin/ruby-prof CHANGED
@@ -13,308 +13,317 @@
13
13
  #
14
14
  # See also the readme "reports" section for the various outputs
15
15
 
16
+ # First require ruby-prof
17
+ require 'rubygems'
18
+ require 'ruby-prof'
19
+
20
+ # Now setup option parser
16
21
  require 'ostruct'
17
22
  require 'optparse'
18
- require File.expand_path('../../lib/ruby-prof', __FILE__)
19
-
20
- options = OpenStruct.new
21
- options.measure_mode = RubyProf::PROCESS_TIME
22
- options.printer = RubyProf::FlatPrinter
23
- options.min_percent = 0
24
- options.file = nil
25
- options.replace_prog_name = false
26
- options.specialized_instruction = false
27
-
28
- opts = OptionParser.new do |opts|
29
- opts.banner = "ruby_prof #{RubyProf::VERSION}\n" +
30
- "Usage: ruby-prof [options] <script.rb> [--] [profiled-script-command-line-options]"
31
-
32
- opts.separator ""
33
- opts.separator "Options:"
34
-
35
-
36
- opts.on('-p printer', '--printer=printer', [:flat, :flat_with_line_numbers, :graph, :graph_html, :call_tree, :call_stack, :dot],
37
- 'Select a printer:',
38
- ' flat - Prints a flat profile as text (default).',
39
- ' flat_with_line_numbers - same as flat, with line numbers.',
40
- ' graph - Prints a graph profile as text.',
41
- ' graph_html - Prints a graph profile as html.',
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'
45
- ) do |printer|
46
-
47
-
48
- case printer
49
- when :flat
50
- options.printer = RubyProf::FlatPrinter
51
- when :flat_with_line_numbers
52
- options.printer = RubyProf::FlatPrinterWithLineNumbers
53
- when :graph
54
- options.printer = RubyProf::GraphPrinter
55
- when :graph_html
56
- options.printer = RubyProf::GraphHtmlPrinter
57
- when :call_tree
58
- options.printer = RubyProf::CallTreePrinter
59
- when :call_stack
60
- options.printer = RubyProf::CallStackPrinter
61
- when :dot
62
- options.printer = RubyProf::DotPrinter
63
- end
64
- end
65
-
66
- opts.on('-m min_percent', '--min_percent=min_percent', Float,
67
- 'The minimum percent a method must take before ',
68
- ' being included in output reports.',
69
- ' this option is not supported for call tree.') do |min_percent|
70
- options.min_percent = min_percent
71
- end
72
23
 
73
- opts.on('-f path', '--file=path',
74
- 'Output results to a file instead of standard out.') do |file|
75
- options.file = file
76
- options.old_wd = Dir.pwd
77
- end
78
-
79
- opts.on('--mode=measure_mode',
80
- [:process, :wall, :cpu, :allocations, :memory, :gc_runs, :gc_time],
81
- 'Select what ruby-prof should measure:',
82
- ' process - Process time (default).',
83
- ' wall - Wall time.',
84
- ' cpu - CPU time (Pentium and PowerPCs only).',
85
- ' allocations - Object allocations (requires patched Ruby interpreter).',
86
- ' memory - Allocated memory in KB (requires patched Ruby interpreter).',
87
- ' gc_runs - Number of garbage collections (requires patched Ruby interpreter).',
88
- ' gc_time - Time spent in garbage collection (requires patched Ruby interpreter).') do |measure_mode|
89
-
90
- case measure_mode
91
- when :process
92
- options.measure_mode = RubyProf::PROCESS_TIME
93
- when :wall
94
- options.measure_mode = RubyProf::WALL_TIME
95
- when :cpu
96
- options.measure_mode = RubyProf::CPU_TIME
97
- when :allocations
98
- options.measure_mode = RubyProf::ALLOCATIONS
99
- when :memory
100
- options.measure_mode = RubyProf::MEMORY
101
- when :gc_runs
102
- options.measure_mode = RubyProf::GC_RUNS
103
- when :gc_time
104
- options.measure_mode = RubyProf::GC_TIME
105
- end
106
- end
24
+ module RubyProf
25
+ class Cmd
26
+ attr_accessor :options
107
27
 
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
28
+ def initialize
29
+ setup_options
30
+ parse_args
126
31
 
127
- opts.on("--replace-progname", "Replace $0 when loading the .rb files.") do
32
+ load_pre_libs
33
+ load_pre_execs
34
+ end
35
+
36
+ def setup_options
37
+ @options = OpenStruct.new
38
+ options.measure_mode = RubyProf::PROCESS_TIME
39
+ options.printer = RubyProf::FlatPrinter
40
+ options.min_percent = 0
41
+ options.file = nil
42
+ options.replace_prog_name = false
43
+ options.specialized_instruction = false
44
+
45
+ options.pre_libs = Array.new
46
+ options.pre_execs = Array.new
47
+ end
48
+
49
+ def option_parser
50
+ OptionParser.new do |opts|
51
+ opts.banner = "ruby_prof #{RubyProf::VERSION}\n" +
52
+ "Usage: ruby-prof [options] <script.rb> [--] [profiled-script-command-line-options]"
53
+
54
+ opts.separator ""
55
+ opts.separator "Options:"
56
+
57
+ opts.on('-p printer', '--printer=printer', [:flat, :flat_with_line_numbers, :graph, :graph_html, :call_tree, :call_stack, :dot],
58
+ 'Select a printer:',
59
+ ' flat - Prints a flat profile as text (default).',
60
+ ' flat_with_line_numbers - same as flat, with line numbers.',
61
+ ' graph - Prints a graph profile as text.',
62
+ ' graph_html - Prints a graph profile as html.',
63
+ ' call_tree - format for KCacheGrind',
64
+ ' call_stack - prints a HTML visualization of the call tree',
65
+ ' dot - Prints a graph profile as a dot file'
66
+ ) do |printer|
67
+
68
+
69
+ case printer
70
+ when :flat
71
+ options.printer = RubyProf::FlatPrinter
72
+ when :flat_with_line_numbers
73
+ options.printer = RubyProf::FlatPrinterWithLineNumbers
74
+ when :graph
75
+ options.printer = RubyProf::GraphPrinter
76
+ when :graph_html
77
+ options.printer = RubyProf::GraphHtmlPrinter
78
+ when :call_tree
79
+ options.printer = RubyProf::CallTreePrinter
80
+ when :call_stack
81
+ options.printer = RubyProf::CallStackPrinter
82
+ when :dot
83
+ options.printer = RubyProf::DotPrinter
84
+ end
85
+ end
86
+
87
+ opts.on('-m min_percent', '--min_percent=min_percent', Float,
88
+ 'The minimum percent a method must take before ',
89
+ ' being included in output reports.',
90
+ ' this option is not supported for call tree.') do |min_percent|
91
+ options.min_percent = min_percent
92
+ end
93
+
94
+ opts.on('-f path', '--file=path',
95
+ 'Output results to a file instead of standard out.') do |file|
96
+ options.file = file
97
+ options.old_wd = Dir.pwd
98
+ end
99
+
100
+ opts.on('--mode=measure_mode',
101
+ [:process, :wall, :cpu, :allocations, :memory, :gc_runs, :gc_time],
102
+ 'Select what ruby-prof should measure:',
103
+ ' process - Process time (default).',
104
+ ' wall - Wall time.',
105
+ ' cpu - CPU time (Pentium and PowerPCs only).',
106
+ ' allocations - Object allocations (requires patched Ruby interpreter).',
107
+ ' memory - Allocated memory in KB (requires patched Ruby interpreter).',
108
+ ' gc_runs - Number of garbage collections (requires patched Ruby interpreter).',
109
+ ' gc_time - Time spent in garbage collection (requires patched Ruby interpreter).') do |measure_mode|
110
+
111
+ case measure_mode
112
+ when :process
113
+ options.measure_mode = RubyProf::PROCESS_TIME
114
+ when :wall
115
+ options.measure_mode = RubyProf::WALL_TIME
116
+ when :cpu
117
+ options.measure_mode = RubyProf::CPU_TIME
118
+ when :allocations
119
+ options.measure_mode = RubyProf::ALLOCATIONS
120
+ when :memory
121
+ options.measure_mode = RubyProf::MEMORY
122
+ when :gc_runs
123
+ options.measure_mode = RubyProf::GC_RUNS
124
+ when :gc_time
125
+ options.measure_mode = RubyProf::GC_TIME
126
+ end
127
+ end
128
+
129
+ opts.on('-s sort_mode', '--sort=sort_mode', [:total, :self, :wait, :child],
130
+ 'Select how ruby-prof results should be sorted:',
131
+ ' total - Total time',
132
+ ' self - Self time',
133
+ ' wait - Wait time',
134
+ ' child - Child time') do |sort_mode|
135
+
136
+ options.sort_method = case sort_mode
137
+ when :total
138
+ :total_time
139
+ when :self
140
+ :self_time
141
+ when :wait
142
+ :wait_time
143
+ when :child
144
+ :children_time
145
+ end
146
+ end
147
+
148
+ opts.on("--replace-progname", "Replace $0 when loading the .rb files.") do
128
149
  options.replace_prog_name = true
129
- end
150
+ end
130
151
 
131
- if defined?(VM)
132
- opts.on("--specialized-instruction", "Turn on specified instruction.") do
152
+ if defined?(VM)
153
+ opts.on("--specialized-instruction", "Turn on specified instruction.") do
133
154
  options.specialized_instruction = true
155
+ end
156
+ end
157
+
158
+ opts.on_tail("-h", "--help", "Show help message") do
159
+ puts opts
160
+ exit
161
+ end
162
+
163
+ opts.on_tail("--version", "Show version #{RubyProf::VERSION}") do
164
+ puts "ruby_prof " + RubyProf::VERSION
165
+ exit
166
+ end
167
+
168
+ opts.on("-v","Show version, set $VERBOSE to true, profile script if option given") do
169
+ puts "ruby version: " + [RUBY_PATCHLEVEL, RUBY_PLATFORM, RUBY_VERSION].join(' ')
170
+ $VERBOSE = true
171
+ end
172
+
173
+ opts.on("-d", "Set $DEBUG to true") do
174
+ $DEBUG = true
175
+ end
176
+
177
+ opts.on('-R lib', '--require-noprof lib', 'require a specific library (not profiled)') do |lib|
178
+ options.pre_libs << lib
179
+ end
180
+
181
+ opts.on('-E code', '--eval-noprof code', 'execute the ruby statements (not profiled)') do |code|
182
+ options.pre_execs << code
183
+ end
184
+
185
+ opts.on('-x regexp', '--exclude regexp', 'exclude methods by regexp (see method elimination)') do|meth|
186
+ options.eliminate_methods ||= []
187
+ options.eliminate_methods << Regexp.new(meth)
188
+ end
189
+
190
+ opts.on('-X file', '--exclude-file file', 'exclude methods by regexp listed in file (see method elimination)') do|file|
191
+ options.eliminate_methods_files ||= []
192
+ options.eliminate_methods_files << file
193
+ end
194
+
195
+ opts.on('--exclude-common-cycles', 'make common iterators like Integer#times appear inlined') do |meth|
196
+ options.eliminate_methods ||= []
197
+ options.eliminate_methods += %w{
198
+ Integer#times
199
+ Integer#upto
200
+ Integer#downto
201
+ Enumerator#each
202
+ Enumerator#each_with_index
203
+ Enumerator#each_with_object
204
+
205
+ Array#each
206
+ Array#each_index
207
+ Array#reverse_each
208
+ Array#map
209
+
210
+ Hash#each
211
+ Hash#each_pair
212
+ Hash#each_key
213
+ Hash#each_value
214
+
215
+ Range#each
216
+ Enumerable#each_cons
217
+ Enumerable#each_entry
218
+ Enumerable#each_slice
219
+ Enumerable#each_with_index
220
+ Enumerable#each_with_object
221
+ Enumerable#reverse_each
222
+ Enumerable#inject
223
+ Enumerable#collect
224
+ Enumerable#reduce
225
+ }
226
+ #TODO: may be the whole Enumerable module should be excluded via 'Enumerable#.*', we need feedback on use cases.
227
+ end
228
+
229
+ opts.on('--exclude-common-callbacks', 'make common callbacks invocations like Integer#times appear inlined so you can see call origins in graph') do|meth|
230
+ options.eliminate_methods ||= []
231
+ options.eliminate_methods += %w{
232
+ Method#call
233
+ Proc#call
234
+ ActiveSupport::Callbacks::ClassMethods#__run_callback
235
+ }
236
+ end
237
+ end
134
238
  end
135
- end
136
-
137
- opts.on_tail("-h", "--help", "Show help message") do
138
- puts opts
139
- exit
140
- end
141
-
142
- opts.on_tail("--version", "Show version #{RubyProf::VERSION}") do
143
- puts "ruby_prof " + RubyProf::VERSION
144
- exit
145
- end
146
-
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
150
- end
151
-
152
- opts.on("-d", "Set $DEBUG to true") do
153
- $DEBUG = true
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
239
 
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
240
+ def parse_args
241
+ # Make sure the user specified at least one file
242
+ if ARGV.length < 1 and not options.exec
243
+ puts opts
244
+ puts ""
245
+ puts "Must specify a script to run"
246
+ exit(-1)
247
+ end
165
248
 
166
- opts.on('-r lib', '--require lib', 'require a specific library') do |lib|
167
- options.libs ||= []
168
- options.libs << lib
169
- end
249
+ self.option_parser.parse! ARGV
250
+ rescue OptionParser::InvalidOption, OptionParser::InvalidArgument, OptionParser::MissingArgument => e
251
+ puts opts
252
+ puts e.message
253
+ exit(-1)
254
+ end
170
255
 
171
- opts.on('-e code', '--eval', 'execute the ruby statements') do |code|
172
- options.exec ||= []
173
- options.exec << code
174
- end
256
+ def load_pre_libs
257
+ options.pre_libs.each do |lib|
258
+ require lib
259
+ end
260
+ end
175
261
 
176
- opts.on('-x regexp', '--exclude regexp', 'exclude methods by regexp (see method elimination)') do|meth|
177
- options.eliminate_methods ||= []
178
- options.eliminate_methods << Regexp.new(meth)
179
- end
262
+ def load_pre_execs
263
+ options.pre_execs.each do |exec|
264
+ eval(exec)
265
+ end
266
+ end
180
267
 
181
- opts.on('-X file', '--exclude-file file', 'exclude methods by regexp listed in file (see method elimination)') do|file|
182
- options.eliminate_methods_files ||= []
183
- options.eliminate_methods_files << file
184
- end
268
+ def run
269
+ # Get the script we will execute
270
+ script = ARGV.shift
271
+ if options.replace_prog_name
272
+ $0 = File.expand_path(script)
273
+ end
185
274
 
186
- opts.on('--exclude-common-cycles', 'make common iterators like Integer#times appear inlined') do|meth|
187
- options.eliminate_methods ||= []
188
- options.eliminate_methods += %w{
189
- Integer#times
190
- Integer#upto
191
- Integer#downto
192
- Enumerator#each
193
- Enumerator#each_with_index
194
- Enumerator#each_with_object
195
-
196
- Array#each
197
- Array#each_index
198
- Array#reverse_each
199
- Array#map
200
-
201
- Hash#each
202
- Hash#each_pair
203
- Hash#each_key
204
- Hash#each_value
205
-
206
- Range#each
207
- Enumerable#each_cons
208
- Enumerable#each_entry
209
- Enumerable#each_slice
210
- Enumerable#each_with_index
211
- Enumerable#each_with_object
212
- Enumerable#reverse_each
213
- Enumerable#inject
214
- Enumerable#collect
215
- Enumerable#reduce
216
- }
217
- #TODO: may be the whole Enumerable module should be excluded via 'Enumerable#.*', we need feedback on use cases.
218
- end
275
+ # Set VM compile option
276
+ if defined?(VM)
277
+ VM::InstructionSequence.compile_option = {
278
+ :trace_instruction => true,
279
+ :specialized_instruction => options.specialized_instruction
280
+ }
281
+ end
219
282
 
220
- opts.on('--exclude-common-callbacks', 'make common callbacks invocations like Integer#times appear inlined so you can see call origins in graph') do|meth|
221
- options.eliminate_methods ||= []
222
- options.eliminate_methods += %w{
223
- Method#call
224
- Proc#call
225
- ActiveSupport::Callbacks::ClassMethods#__run_callback
226
- }
283
+ # Set the measure mode
284
+ RubyProf.measure_mode = options.measure_mode
285
+ RubyProf.start_script(script)
286
+ end
227
287
  end
228
288
  end
229
289
 
230
- begin
231
- opts.parse! ARGV
232
- rescue OptionParser::InvalidOption, OptionParser::InvalidArgument,
233
- OptionParser::MissingArgument => e
234
- puts opts
235
- puts
236
- puts e.message
237
- exit(-1)
238
- end
239
-
240
- # Make sure the user specified at least one file
241
- if ARGV.length < 1 and not options.exec
242
- puts opts
243
- puts ""
244
- puts "Must specify a script to run"
245
- exit(-1)
246
- end
247
-
290
+ # Parse command line options
291
+ cmd = RubyProf::Cmd.new
248
292
 
249
- # Install at_exit handler. It is important that we do this
293
+ # Install at_exit handler. It is important that we do this
250
294
  # before loading the scripts so our at_exit handler run
251
- # *after* any other one that will be installed.
295
+ # *after* any other one that will be installed.
252
296
 
253
297
  at_exit {
254
298
  # Stop profiling
255
299
  result = RubyProf.stop
256
300
 
257
301
  # Eliminate unwanted methods from call graph
258
- result.eliminate_methods! options.eliminate_methods if options.eliminate_methods
259
- options.eliminate_methods_files.each{|f| result.eliminate_methods!(f)} if options.eliminate_methods_files
302
+ if cmd.options.eliminate_methods
303
+ result.eliminate_methods!(cmd.options.eliminate_methods)
304
+ end
305
+
306
+ if cmd.options.eliminate_methods_files
307
+ cmd.options.eliminate_methods_files.each {|f| result.eliminate_methods!(f)}
308
+ end
260
309
 
261
310
  # Create a printer
262
- printer = options.printer.new(result)
263
- printer_options = {:min_percent => options.min_percent, :sort_method => options.sort_method}
311
+ printer = cmd.options.printer.new(result)
312
+ printer_options = {:min_percent => cmd.options.min_percent, :sort_method => cmd.options.sort_method}
264
313
 
265
314
  # Get output
266
- if options.file
315
+ if cmd.options.file
267
316
  # 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.
268
- Dir.chdir(options.old_wd) do
269
- File.open(options.file, 'w') do |file|
317
+ Dir.chdir(cmd.options.old_wd) do
318
+ File.open(cmd.options.file, 'w') do |file|
270
319
  printer.print(file, printer_options)
271
320
  end
272
321
  end
273
322
  else
274
- # Print out results
323
+ # Print out results
275
324
  printer.print(STDOUT, printer_options)
276
325
  end
277
326
  }
278
327
 
279
- # Now set measure mode
280
- RubyProf.measure_mode = options.measure_mode
281
-
282
- # Set VM compile option
283
- if defined?(VM)
284
- VM::InstructionSequence.compile_option = {
285
- :trace_instruction => true,
286
- :specialized_instruction => options.specialized_instruction
287
- }
288
- end
289
-
290
- # Get the script we will execute
291
- script = ARGV.shift
292
- if options.replace_prog_name
293
- $0 = File.expand_path(script)
294
- end
295
-
296
- if options.pre_libs
297
- options.pre_libs.each { |l| require l }
298
- end
299
-
300
- if options.pre_exec
301
- options.pre_exec.each { |c| eval c }
302
- end
303
-
304
- # do not pollute profiling report with OpenStruct#libs
305
- ol = options.libs
306
- oe = options.exec
307
-
308
- # Start profiling
309
- RubyProf.start
310
-
311
- if ol
312
- ol.each { |l| require l }
313
- end
314
-
315
- if oe
316
- oe.each { |c| eval c }
317
- end
318
-
319
- # Load the script
320
- load script if script
328
+ # Now profile some code
329
+ cmd.run