ruby-prof 0.9.2 → 0.10.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.
- data/CHANGES +13 -0
- data/README.rdoc +23 -9
- data/Rakefile +7 -62
- data/bin/ruby-prof +47 -38
- data/examples/empty.png +0 -0
- data/examples/minus.png +0 -0
- data/examples/plus.png +0 -0
- data/ext/ruby_prof/extconf.rb +15 -1
- data/ext/ruby_prof/measure_allocations.h +25 -0
- data/ext/ruby_prof/measure_process_time.h +12 -1
- data/ext/ruby_prof/ruby_prof.c +1 -1
- data/ext/ruby_prof/version.h +2 -2
- data/lib/ruby-prof.rb +9 -15
- data/lib/ruby-prof/call_stack_printer.rb +27 -1
- data/lib/ruby-prof/call_tree_printer.rb +12 -1
- data/lib/ruby-prof/dot_printer.rb +0 -1
- data/lib/ruby-prof/empty.png +0 -0
- data/lib/ruby-prof/flat_printer.rb +1 -2
- data/lib/ruby-prof/flat_printer_with_line_numbers.rb +2 -3
- data/lib/ruby-prof/graph_html_printer.rb +7 -1
- data/lib/ruby-prof/graph_printer.rb +1 -2
- data/lib/ruby-prof/minus.png +0 -0
- data/lib/ruby-prof/plus.png +0 -0
- data/lib/ruby-prof/rack.rb +7 -5
- data/lib/ruby-prof/task.rb +0 -0
- data/test/aggregate_test.rb +0 -0
- data/test/basic_test.rb +0 -0
- data/test/duplicate_names_test.rb +0 -0
- data/test/enumerable_test.rb +0 -0
- data/test/exceptions_test.rb +0 -0
- data/test/exclude_threads_test.rb +0 -0
- data/test/exec_test.rb +0 -0
- data/test/line_number_test.rb +0 -0
- data/test/measurement_test.rb +0 -0
- data/test/module_test.rb +1 -1
- data/test/multi_printer_test.rb +0 -0
- data/test/no_method_class_test.rb +0 -0
- data/test/printers_test.rb +0 -0
- data/test/recursive_test.rb +0 -0
- data/test/singleton_test.rb +0 -0
- data/test/stack_printer_test.rb +0 -0
- data/test/stack_test.rb +0 -0
- data/test/start_stop_test.rb +0 -0
- data/test/thread_test.rb +0 -0
- data/test/unique_call_path_test.rb +0 -0
- metadata +10 -7
- data/test/bad.rb +0 -6
- data/test/basic2_test.rb +0 -20
data/CHANGES
CHANGED
@@ -1,3 +1,16 @@
|
|
1
|
+
0.10.2
|
2
|
+
=======================
|
3
|
+
Fix for 1.9.2, os x for latest commits (thanks skaes!)
|
4
|
+
|
5
|
+
0.10.1
|
6
|
+
=======================
|
7
|
+
Fix bug in linux wall time, also load with only relative paths so that you can use it to benchmark rubygems startup overhead,
|
8
|
+
itself.
|
9
|
+
|
10
|
+
0.10.0
|
11
|
+
=======================
|
12
|
+
Some rdoc changes, for linux wall time attempt to use higher granularity (thanks to all the contributors for this round!)
|
13
|
+
|
1
14
|
0.9.2
|
2
15
|
=======================
|
3
16
|
Make graphviz work on 1.8.6
|
data/README.rdoc
CHANGED
@@ -12,7 +12,6 @@ ruby-prof is a fast code profiler for Ruby. Its features include:
|
|
12
12
|
- Call tree profiles - outputs results in the calltree format suitable for the KCacheGrind profiling tool.
|
13
13
|
* Threads - supports profiling multiple threads simultaneously
|
14
14
|
|
15
|
-
|
16
15
|
== Requirements
|
17
16
|
|
18
17
|
ruby-prof requires Ruby 1.8.4 or higher.
|
@@ -21,7 +20,7 @@ If you are running Linux or Unix you'll need a C compiler so the extension
|
|
21
20
|
can be compiled when it is installed.
|
22
21
|
|
23
22
|
If you are running Windows, then you may need to install the
|
24
|
-
Windows specific RubyGem which includes an already built extension (see
|
23
|
+
Windows specific RubyGem which includes an already built extension (see Install section).
|
25
24
|
|
26
25
|
== Install
|
27
26
|
|
@@ -32,9 +31,9 @@ The easiest way to install ruby-prof is by using Ruby Gems. To install:
|
|
32
31
|
If you on windows mswin [not mingw] (check via ruby -v) and
|
33
32
|
don't have an MSVC compiler, please install v0.7.3 which
|
34
33
|
has a prebuilt binary
|
35
|
-
C:> gem install ruby-prof -v0.
|
34
|
+
C:> gem install ruby-prof -v0.8.1
|
36
35
|
|
37
|
-
If you're on mingw, please install the devkit first, then install the latest version (gem install ruby-prof).
|
36
|
+
If you're on mingw, please install the devkit first, then install the latest gem version (gem install ruby-prof).
|
38
37
|
|
39
38
|
== Usage
|
40
39
|
|
@@ -79,7 +78,7 @@ to profile:
|
|
79
78
|
|
80
79
|
# Print a graph profile to text
|
81
80
|
printer = RubyProf::GraphPrinter.new(result)
|
82
|
-
printer.print(STDOUT,
|
81
|
+
printer.print(STDOUT, {})
|
83
82
|
|
84
83
|
Starting with the 0.6.1 release, ruby-prof also supports pausing and resuming
|
85
84
|
profiling runs.
|
@@ -117,11 +116,22 @@ The third way of using ruby-prof is by requiring unprof.rb:
|
|
117
116
|
|
118
117
|
require 'unprof'
|
119
118
|
|
120
|
-
This will start profiling immediately and will output the results
|
121
|
-
using a flat profile report.
|
119
|
+
This will start profiling immediately at that point and will output the results
|
120
|
+
using a flat profile report after the process ends.
|
121
|
+
|
122
|
+
|
123
|
+
== Benchmarking full load time ==
|
124
|
+
|
125
|
+
If you want to get a more accurate measurement of what takes a gem's bin/xxx
|
126
|
+
command its time to load, you may want to also measure rubygems' startup penalty.
|
127
|
+
You can do this by calling into bin/ruby-prof directly, ex:
|
122
128
|
|
123
|
-
|
124
|
-
ruby-prof
|
129
|
+
|
130
|
+
$ ruby C:/installs/Ruby187/lib/ruby/gems/1.8/gems/ruby-prof-0.10.0/bin/ruby-prof D:\Ruby192\bin\ruby-prof
|
131
|
+
|
132
|
+
or
|
133
|
+
|
134
|
+
$ ruby C:/installs/Ruby187/lib/ruby/gems/1.8/gems/ruby-prof-0.10.0/bin/ruby-prof some_file_that_does_a_require_rubygems_at_the_beginning
|
125
135
|
|
126
136
|
== Method Elimination
|
127
137
|
|
@@ -230,6 +240,7 @@ ruby-prof can generate a number of different reports:
|
|
230
240
|
* HTML Graph Reports
|
231
241
|
* Call graphs
|
232
242
|
* Call stack reports
|
243
|
+
* More!
|
233
244
|
|
234
245
|
Flat profiles show the overall time spent in each method. They
|
235
246
|
are a good of quickly identifying which methods take the most time.
|
@@ -276,6 +287,7 @@ Reports are created by printers. Supported printers include:
|
|
276
287
|
* RubyProf::CallTreePrinter - Creates a call tree report compatible with KCachegrind.
|
277
288
|
* RubyProf::CallStackPrinter - Creates a HTML visualization of the Ruby stack
|
278
289
|
* RubyProf::MultiPrinter - Uses the other printers to create several reports in one profiling run
|
290
|
+
* More!
|
279
291
|
|
280
292
|
To use a printer:
|
281
293
|
|
@@ -437,3 +449,5 @@ See LICENSE for license information.
|
|
437
449
|
== Development
|
438
450
|
|
439
451
|
Code is located at http://github.com/rdp/ruby-prof
|
452
|
+
|
453
|
+
Google group/mailing list: http://groups.google.com/group/ruby-prof
|
data/Rakefile
CHANGED
@@ -4,68 +4,14 @@ require 'rake/rdoctask'
|
|
4
4
|
require 'rake/testtask'
|
5
5
|
require 'date'
|
6
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
7
|
|
8
|
+
# to release it, do a git tag, then rake cleanr default and publish that
|
9
|
+
# git tag 0.10.1
|
10
|
+
# git push origin 0.10.1
|
11
|
+
# rake cleanr default
|
12
|
+
# gem push pkg/ruby-prof-0.10.1.gem
|
14
13
|
|
15
|
-
|
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 = "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
|
-
|
14
|
+
default_spec = eval File.read(File.expand_path('../ruby-prof.gemspec', __FILE__))
|
69
15
|
|
70
16
|
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
17
|
task :native_gems do
|
@@ -133,8 +79,7 @@ end
|
|
133
79
|
|
134
80
|
desc 'clean stuff'
|
135
81
|
task :cleanr do
|
136
|
-
|
137
|
-
FileUtils.rm 'lib/ruby_prof.bundle' if File.exist? 'lib/ruby_prof.bundle'
|
82
|
+
Dir['**/*.{so,bundle}'].each{|f| File.delete f}
|
138
83
|
Dir.chdir('ext/ruby_prof') do
|
139
84
|
if File.exist? 'Makefile'
|
140
85
|
system("make clean")
|
data/bin/ruby-prof
CHANGED
@@ -9,37 +9,7 @@
|
|
9
9
|
# ruby_prof [options] <script.rb> [--] [script-options]"
|
10
10
|
#
|
11
11
|
# Options:
|
12
|
-
#
|
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
|
12
|
+
# run "$ ruby-prof --help" to see them
|
43
13
|
#
|
44
14
|
#
|
45
15
|
# 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]
|
@@ -47,7 +17,7 @@
|
|
47
17
|
|
48
18
|
require 'ostruct'
|
49
19
|
require 'optparse'
|
50
|
-
require
|
20
|
+
require File.dirname(__FILE__) + "/../lib/ruby-prof"
|
51
21
|
|
52
22
|
options = OpenStruct.new
|
53
23
|
options.measure_mode = RubyProf::PROCESS_TIME
|
@@ -59,7 +29,7 @@ options.specialized_instruction = false
|
|
59
29
|
|
60
30
|
opts = OptionParser.new do |opts|
|
61
31
|
opts.banner = "ruby_prof #{RubyProf::VERSION}\n" +
|
62
|
-
"Usage:
|
32
|
+
"Usage: ruby-prof [options] <script.rb> [--] [script-options]"
|
63
33
|
|
64
34
|
opts.separator ""
|
65
35
|
opts.separator "Options:"
|
@@ -158,14 +128,33 @@ opts = OptionParser.new do |opts|
|
|
158
128
|
end
|
159
129
|
|
160
130
|
opts.on("-v","Show version, set $VERBOSE to true, profile script") do
|
161
|
-
puts "
|
162
|
-
|
163
|
-
$VERBOSE= true
|
131
|
+
puts "ruby version: " + RUBY_DESCRIPTION
|
132
|
+
$VERBOSE = true
|
164
133
|
end
|
165
134
|
|
166
135
|
opts.on("-d", "Set $DEBUG to true") do
|
167
136
|
$DEBUG = true
|
168
137
|
end
|
138
|
+
|
139
|
+
opts.on('-R lib', '--require-noprof lib', 'require a specific library (not profiled)') do |lib|
|
140
|
+
options.pre_libs ||= []
|
141
|
+
options.pre_libs << lib
|
142
|
+
end
|
143
|
+
|
144
|
+
opts.on('-E code', '--eval-noprof code', 'execute the ruby statements (not profiled)') do |code|
|
145
|
+
options.pre_exec ||= []
|
146
|
+
options.pre_exec << code
|
147
|
+
end
|
148
|
+
|
149
|
+
opts.on('-r lib', '--require lib', 'require a specific library') do |lib|
|
150
|
+
options.libs ||= []
|
151
|
+
options.libs << lib
|
152
|
+
end
|
153
|
+
|
154
|
+
opts.on('-e code', '--eval', 'execute the ruby statements') do |code|
|
155
|
+
options.exec ||= []
|
156
|
+
options.exec << code
|
157
|
+
end
|
169
158
|
end
|
170
159
|
|
171
160
|
begin
|
@@ -179,7 +168,7 @@ rescue OptionParser::InvalidOption, OptionParser::InvalidArgument,
|
|
179
168
|
end
|
180
169
|
|
181
170
|
# Make sure the user specified at least one file
|
182
|
-
if ARGV.length < 1
|
171
|
+
if ARGV.length < 1 and not options.exec
|
183
172
|
puts opts
|
184
173
|
puts ""
|
185
174
|
puts "Must specify a script to run"
|
@@ -229,8 +218,28 @@ if options.replace_prog_name
|
|
229
218
|
$0 = File.expand_path(script)
|
230
219
|
end
|
231
220
|
|
221
|
+
if options.pre_libs
|
222
|
+
options.pre_libs.each { |l| require l }
|
223
|
+
end
|
224
|
+
|
225
|
+
if options.pre_exec
|
226
|
+
options.pre_exec.each { |c| eval c }
|
227
|
+
end
|
228
|
+
|
229
|
+
# do not pollute profiling report with OpenStruct#libs
|
230
|
+
ol = options.libs
|
231
|
+
oe = options.exec
|
232
|
+
|
232
233
|
# Start profiling
|
233
234
|
RubyProf.start
|
234
235
|
|
236
|
+
if ol
|
237
|
+
ol.each { |l| require l }
|
238
|
+
end
|
239
|
+
|
240
|
+
if oe
|
241
|
+
oe.each { |c| eval c }
|
242
|
+
end
|
243
|
+
|
235
244
|
# Load the script
|
236
|
-
load script
|
245
|
+
load script if script
|
data/examples/empty.png
CHANGED
File without changes
|
data/examples/minus.png
CHANGED
File without changes
|
data/examples/plus.png
CHANGED
File without changes
|
data/ext/ruby_prof/extconf.rb
CHANGED
@@ -38,6 +38,20 @@ def add_define(name, value = nil)
|
|
38
38
|
$defs.push("-D#{name}")
|
39
39
|
end
|
40
40
|
end
|
41
|
-
|
41
|
+
require 'rubygems'
|
42
|
+
unless Gem.win_platform? || RUBY_PLATFORM =~ /darwin/
|
43
|
+
$LDFLAGS += " -lrt" # for clock_gettime
|
44
|
+
end
|
42
45
|
add_define("RUBY_VERSION", RUBY_VERSION.gsub('.', ''))
|
46
|
+
|
47
|
+
# for ruby 1.9, determine whether threads inherit trace flags (skaes patched 1.9 rubies do)
|
48
|
+
if RUBY_VERSION > "1.9"
|
49
|
+
require 'set'
|
50
|
+
threads = Set.new
|
51
|
+
set_trace_func lambda { |*args| threads << Thread.current.object_id }
|
52
|
+
Thread.new{1}.join
|
53
|
+
set_trace_func nil
|
54
|
+
add_define("THREADS_INHERIT_EVENT_FLAGS", (threads.size == 2) ? "1" : "0")
|
55
|
+
end
|
56
|
+
|
43
57
|
create_makefile("ruby_prof")
|
@@ -46,6 +46,31 @@ convert_allocations(prof_measure_t c)
|
|
46
46
|
measure_allocations -> int
|
47
47
|
|
48
48
|
Returns the total number of object allocations since Ruby started.*/
|
49
|
+
static VALUE
|
50
|
+
prof_measure_allocations(VALUE self)
|
51
|
+
{
|
52
|
+
#if defined(HAVE_LONG_LONG)
|
53
|
+
return ULL2NUM(rb_os_allocated_objects());
|
54
|
+
#else
|
55
|
+
return ULONG2NUM(rb_os_allocated_objects());
|
56
|
+
#endif
|
57
|
+
}
|
58
|
+
|
59
|
+
#elif defined(HAVE_RB_GC_MALLOC_ALLOCATIONS)
|
60
|
+
#define MEASURE_ALLOCATIONS 3
|
61
|
+
|
62
|
+
static prof_measure_t
|
63
|
+
measure_allocations()
|
64
|
+
{
|
65
|
+
return rb_gc_malloc_allocations();
|
66
|
+
}
|
67
|
+
|
68
|
+
static double
|
69
|
+
convert_allocations(prof_measure_t c)
|
70
|
+
{
|
71
|
+
return c;
|
72
|
+
}
|
73
|
+
|
49
74
|
static VALUE
|
50
75
|
prof_measure_allocations(VALUE self)
|
51
76
|
{
|
@@ -31,13 +31,24 @@
|
|
31
31
|
static prof_measure_t
|
32
32
|
measure_process_time()
|
33
33
|
{
|
34
|
-
|
34
|
+
#if defined(__linux__)
|
35
|
+
struct timespec time;
|
36
|
+
clock_gettime(CLOCK_PROCESS_CPUTIME_ID , &time);
|
37
|
+
return time.tv_sec * 1000000000 + time.tv_nsec ;
|
38
|
+
#else
|
39
|
+
return clock();
|
40
|
+
#endif
|
35
41
|
}
|
36
42
|
|
43
|
+
|
37
44
|
static double
|
38
45
|
convert_process_time(prof_measure_t c)
|
39
46
|
{
|
47
|
+
#if defined(__linux__)
|
48
|
+
return (double) c / 1000000000;
|
49
|
+
#else
|
40
50
|
return (double) c / CLOCKS_PER_SEC;
|
51
|
+
#endif
|
41
52
|
}
|
42
53
|
|
43
54
|
/* Document-method: measure_process_time
|
data/ext/ruby_prof/ruby_prof.c
CHANGED
@@ -1160,7 +1160,7 @@ prof_event_hook(rb_event_flag_t event, NODE *node, VALUE self, ID mid, VALUE kla
|
|
1160
1160
|
thread = rb_thread_current();
|
1161
1161
|
thread_id = rb_obj_id(thread);
|
1162
1162
|
|
1163
|
-
# if RUBY_VERSION >= 191
|
1163
|
+
# if RUBY_VERSION >= 191 && THREADS_INHERIT_EVENT_FLAGS==0
|
1164
1164
|
/* ensure that new threads are hooked [sigh] (bug in core) */
|
1165
1165
|
prof_remove_hook();
|
1166
1166
|
prof_install_hook();
|
data/ext/ruby_prof/version.h
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#define RUBY_PROF_VERSION "0.
|
1
|
+
#define RUBY_PROF_VERSION "0.10.2" // for easy parsing from rake files
|
2
2
|
#define RUBY_PROF_VERSION_MAJ 0
|
3
|
-
#define RUBY_PROF_VERSION_MIN
|
3
|
+
#define RUBY_PROF_VERSION_MIN 10
|
4
4
|
#define RUBY_PROF_VERSION_MIC 2
|
data/lib/ruby-prof.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# require the
|
1
|
+
# require the .so (ext) file...
|
2
2
|
|
3
3
|
me = File.dirname(__FILE__) + '/'
|
4
4
|
begin
|
@@ -8,20 +8,14 @@ rescue Exception
|
|
8
8
|
require "#{me}/../ext/ruby_prof/ruby_prof"
|
9
9
|
end
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
require
|
18
|
-
|
19
|
-
require "ruby-prof/call_tree_printer"
|
20
|
-
require "ruby-prof/call_stack_printer"
|
21
|
-
require "ruby-prof/multi_printer"
|
22
|
-
require "ruby-prof/dot_printer"
|
23
|
-
require "ruby-prof/symbol_to_proc" # for 1.8's backward compatibility benefit
|
24
|
-
require "ruby-prof/rack"
|
11
|
+
# have to load them by hand since we don't want to load 'unprof'
|
12
|
+
|
13
|
+
for file in ['abstract_printer', 'result', 'method_info', 'call_info', 'aggregate_call_info', 'flat_printer', 'flat_printer_with_line_numbers',
|
14
|
+
'graph_printer', 'graph_html_printer', 'call_tree_printer', 'call_stack_printer', 'multi_printer', 'dot_printer', 'symbol_to_proc', # for 1.8's backward compatible benefit
|
15
|
+
'rack']
|
16
|
+
|
17
|
+
require File.dirname(__FILE__) + '/ruby-prof/' + file
|
18
|
+
end
|
25
19
|
|
26
20
|
module RubyProf
|
27
21
|
# See if the user specified the clock mode via
|
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'ruby-prof/abstract_printer'
|
2
1
|
require 'erb'
|
3
2
|
require 'fileutils'
|
4
3
|
|
@@ -11,6 +10,33 @@ module RubyProf
|
|
11
10
|
super(result)
|
12
11
|
end
|
13
12
|
|
13
|
+
# Specify print options.
|
14
|
+
#
|
15
|
+
# options - Hash table
|
16
|
+
# :min_percent - Number 0 to 100 that specifes the minimum
|
17
|
+
# %self (the methods self time divided by the
|
18
|
+
# overall total time) that a method must take
|
19
|
+
# for it to be printed out in the report.
|
20
|
+
# Default value is 0.
|
21
|
+
#
|
22
|
+
# :print_file - True or false. Specifies if a method's source
|
23
|
+
# file should be printed. Default value if false.
|
24
|
+
#
|
25
|
+
# :threshold - a float from 0 to 100 that sets the threshold of
|
26
|
+
# results displayed.
|
27
|
+
# Default value is 1.0
|
28
|
+
#
|
29
|
+
# :title - a String to overide the default "ruby-prof call tree"
|
30
|
+
# title of the report.
|
31
|
+
#
|
32
|
+
# :expansion - a float from 0 to 100 that sets the threshold of
|
33
|
+
# results that are expanded, if the percent_total
|
34
|
+
# exceeds it.
|
35
|
+
# Default value is 10.0
|
36
|
+
#
|
37
|
+
# :application - a String to overide the name of the application,
|
38
|
+
# as it appears on the report.
|
39
|
+
#
|
14
40
|
def print(output = STDOUT, options = {})
|
15
41
|
@output = output
|
16
42
|
setup_options(options)
|
@@ -1,10 +1,21 @@
|
|
1
|
-
require 'ruby-prof/abstract_printer'
|
2
1
|
|
3
2
|
module RubyProf
|
4
3
|
# Generate profiling information in calltree format
|
5
4
|
# for use by kcachegrind and similar tools.
|
6
5
|
|
7
6
|
class CallTreePrinter < AbstractPrinter
|
7
|
+
# Specify print options.
|
8
|
+
#
|
9
|
+
# options - Hash table
|
10
|
+
# :min_percent - Number 0 to 100 that specifes the minimum
|
11
|
+
# %self (the methods self time divided by the
|
12
|
+
# overall total time) that a method must take
|
13
|
+
# for it to be printed out in the report.
|
14
|
+
# Default value is 0.
|
15
|
+
#
|
16
|
+
# :print_file - True or false. Specifies if a method's source
|
17
|
+
# file should be printed. Default value if false.
|
18
|
+
#
|
8
19
|
def print(output = STDOUT, options = {})
|
9
20
|
@output = output
|
10
21
|
setup_options(options)
|
data/lib/ruby-prof/empty.png
CHANGED
File without changes
|
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'ruby-prof/abstract_printer'
|
2
1
|
|
3
2
|
module RubyProf
|
4
3
|
# Generates flat[link:files/examples/flat_txt.html] profile reports as text.
|
@@ -9,7 +8,7 @@ module RubyProf
|
|
9
8
|
# end
|
10
9
|
#
|
11
10
|
# printer = RubyProf::FlatPrinter.new(result)
|
12
|
-
# printer.print(STDOUT,
|
11
|
+
# printer.print(STDOUT, {})
|
13
12
|
#
|
14
13
|
class FlatPrinter < AbstractPrinter
|
15
14
|
# Print a flat profile report to the provided output.
|
@@ -1,5 +1,4 @@
|
|
1
|
-
|
2
|
-
require 'pathname'
|
1
|
+
|
3
2
|
module RubyProf
|
4
3
|
# Generates flat[link:files/examples/flat_txt.html] profile reports as text.
|
5
4
|
# To use the flat printer with line numbers:
|
@@ -9,7 +8,7 @@ module RubyProf
|
|
9
8
|
# end
|
10
9
|
#
|
11
10
|
# printer = RubyProf::FlatPrinterWithLineNumbers.new(result)
|
12
|
-
# printer.print(STDOUT,
|
11
|
+
# printer.print(STDOUT, {})
|
13
12
|
#
|
14
13
|
class FlatPrinterWithLineNumbers < FlatPrinter
|
15
14
|
|
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'ruby-prof/abstract_printer'
|
2
1
|
require 'erb'
|
3
2
|
|
4
3
|
module RubyProf
|
@@ -43,6 +42,13 @@ module RubyProf
|
|
43
42
|
# options - Hash of print options. See #setup_options
|
44
43
|
# for more information.
|
45
44
|
#
|
45
|
+
# unique options are:
|
46
|
+
# :filename - specify a file to use that contains the ERB
|
47
|
+
# template to use, instead of the built-in self.template
|
48
|
+
#
|
49
|
+
# :template - specify an ERB template to use, instead of the
|
50
|
+
# built-in self.template
|
51
|
+
#
|
46
52
|
def print(output = STDOUT, options = {})
|
47
53
|
@output = output
|
48
54
|
setup_options(options)
|
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'ruby-prof/abstract_printer'
|
2
1
|
|
3
2
|
module RubyProf
|
4
3
|
# Generates graph[link:files/examples/graph_txt.html] profile reports as text.
|
@@ -9,7 +8,7 @@ module RubyProf
|
|
9
8
|
# end
|
10
9
|
#
|
11
10
|
# printer = RubyProf::GraphPrinter.new(result, 5)
|
12
|
-
# printer.print(STDOUT,
|
11
|
+
# printer.print(STDOUT, {})
|
13
12
|
#
|
14
13
|
# The constructor takes two arguments. See the README
|
15
14
|
|
data/lib/ruby-prof/minus.png
CHANGED
File without changes
|
data/lib/ruby-prof/plus.png
CHANGED
File without changes
|
data/lib/ruby-prof/rack.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'tmpdir'
|
2
|
+
|
1
3
|
module Rack
|
2
4
|
class RubyProf
|
3
5
|
def initialize(app)
|
@@ -13,13 +15,13 @@ module Rack
|
|
13
15
|
result
|
14
16
|
end
|
15
17
|
|
16
|
-
def print
|
17
|
-
printers = {::RubyProf::FlatPrinter => '
|
18
|
-
::RubyProf::GraphHtmlPrinter => '
|
18
|
+
def print(data)
|
19
|
+
printers = {::RubyProf::FlatPrinter => ::File.join(Dir.tmpdir, 'profile.txt'),
|
20
|
+
::RubyProf::GraphHtmlPrinter => ::File.join(Dir.tmpdir, 'profile.html')}
|
19
21
|
|
20
22
|
printers.each do |printer_klass, file_name|
|
21
|
-
printer = printer_klass.new(
|
22
|
-
|
23
|
+
printer = printer_klass.new(data)
|
24
|
+
::File.open(file_name, 'wb') do |file|
|
23
25
|
printer.print(file, :min_percent => 0.00000001 )
|
24
26
|
end
|
25
27
|
end
|
data/lib/ruby-prof/task.rb
CHANGED
File without changes
|
data/test/aggregate_test.rb
CHANGED
File without changes
|
data/test/basic_test.rb
CHANGED
File without changes
|
File without changes
|
data/test/enumerable_test.rb
CHANGED
File without changes
|
data/test/exceptions_test.rb
CHANGED
File without changes
|
File without changes
|
data/test/exec_test.rb
CHANGED
File without changes
|
data/test/line_number_test.rb
CHANGED
File without changes
|
data/test/measurement_test.rb
CHANGED
File without changes
|
data/test/module_test.rb
CHANGED
@@ -38,7 +38,7 @@ class ModuleTest < Test::Unit::TestCase
|
|
38
38
|
|
39
39
|
# these methods should be in there... (hard to tell order though).
|
40
40
|
for name in ['ModuleTest#test_nested_modules','Bar#hello','Kernel#sleep','<Module::Bar>#hello','<Module::Foo>#hello']
|
41
|
-
assert methods.map(&:full_name).include? name
|
41
|
+
assert methods.map(&:full_name).include?( name )
|
42
42
|
end
|
43
43
|
end
|
44
44
|
end
|
data/test/multi_printer_test.rb
CHANGED
File without changes
|
File without changes
|
data/test/printers_test.rb
CHANGED
File without changes
|
data/test/recursive_test.rb
CHANGED
File without changes
|
data/test/singleton_test.rb
CHANGED
File without changes
|
data/test/stack_printer_test.rb
CHANGED
File without changes
|
data/test/stack_test.rb
CHANGED
File without changes
|
data/test/start_stop_test.rb
CHANGED
File without changes
|
data/test/thread_test.rb
CHANGED
File without changes
|
File without changes
|
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-prof
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 51
|
5
|
+
prerelease:
|
5
6
|
segments:
|
6
7
|
- 0
|
7
|
-
-
|
8
|
+
- 10
|
8
9
|
- 2
|
9
|
-
version: 0.
|
10
|
+
version: 0.10.2
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- Shugo Maeda, Charlie Savage, Roger Pack, Stefan Kaes
|
@@ -14,7 +15,7 @@ autorequire:
|
|
14
15
|
bindir: bin
|
15
16
|
cert_chain: []
|
16
17
|
|
17
|
-
date:
|
18
|
+
date: 2011-04-11 00:00:00 -06:00
|
18
19
|
default_executable:
|
19
20
|
dependencies:
|
20
21
|
- !ruby/object:Gem::Dependency
|
@@ -25,6 +26,7 @@ dependencies:
|
|
25
26
|
requirements:
|
26
27
|
- - ">="
|
27
28
|
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
28
30
|
segments:
|
29
31
|
- 0
|
30
32
|
version: "0"
|
@@ -38,6 +40,7 @@ dependencies:
|
|
38
40
|
requirements:
|
39
41
|
- - ">="
|
40
42
|
- !ruby/object:Gem::Version
|
43
|
+
hash: 3
|
41
44
|
segments:
|
42
45
|
- 0
|
43
46
|
version: "0"
|
@@ -115,8 +118,6 @@ files:
|
|
115
118
|
- rails/example/example_test.rb
|
116
119
|
- rails/profile_test_helper.rb
|
117
120
|
- test/aggregate_test.rb
|
118
|
-
- test/bad.rb
|
119
|
-
- test/basic2_test.rb
|
120
121
|
- test/basic_test.rb
|
121
122
|
- test/current_failures_windows
|
122
123
|
- test/do_nothing.rb
|
@@ -158,6 +159,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
158
159
|
requirements:
|
159
160
|
- - ">="
|
160
161
|
- !ruby/object:Gem::Version
|
162
|
+
hash: 63
|
161
163
|
segments:
|
162
164
|
- 1
|
163
165
|
- 8
|
@@ -168,13 +170,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
168
170
|
requirements:
|
169
171
|
- - ">="
|
170
172
|
- !ruby/object:Gem::Version
|
173
|
+
hash: 3
|
171
174
|
segments:
|
172
175
|
- 0
|
173
176
|
version: "0"
|
174
177
|
requirements: []
|
175
178
|
|
176
179
|
rubyforge_project: ruby-prof
|
177
|
-
rubygems_version: 1.
|
180
|
+
rubygems_version: 1.6.2
|
178
181
|
signing_key:
|
179
182
|
specification_version: 3
|
180
183
|
summary: Fast Ruby profiler
|
data/test/bad.rb
DELETED
data/test/basic2_test.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'test/unit'
|
4
|
-
require 'ruby-prof'
|
5
|
-
|
6
|
-
# test for http://redmine.ruby-lang.org/issues/show/3660 and others that show 1.9.1 not having correct return methods..
|
7
|
-
|
8
|
-
class SingletonTest < Test::Unit::TestCase
|
9
|
-
def test_singleton
|
10
|
-
result = RubyProf.profile do
|
11
|
-
a = [1,2,3]
|
12
|
-
a.each{ |n|
|
13
|
-
}
|
14
|
-
end
|
15
|
-
printer = RubyProf::FlatPrinter.new(result)
|
16
|
-
output = ENV['SHOW_RUBY_PROF_PRINTER_OUTPUT'] == "1" ? STDOUT : ''
|
17
|
-
output = STDOUT
|
18
|
-
printer.print(output)
|
19
|
-
end
|
20
|
-
end
|