ruby-prof 0.13.1 → 0.14.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES +14 -0
- data/README.rdoc +1 -1
- data/Rakefile +2 -3
- data/bin/ruby-prof +4 -4
- data/bin/ruby-prof-check-trace +45 -0
- data/doc/LICENSE.html +49 -88
- data/doc/README_rdoc.html +92 -106
- data/doc/Rack.html +47 -116
- data/doc/Rack/RubyProf.html +119 -174
- data/doc/RubyProf.html +184 -216
- data/doc/RubyProf/AbstractPrinter.html +131 -162
- data/doc/RubyProf/AggregateCallInfo.html +136 -166
- data/doc/RubyProf/CallInfo.html +113 -154
- data/doc/RubyProf/CallInfoPrinter.html +56 -123
- data/doc/RubyProf/CallInfoVisitor.html +87 -216
- data/doc/RubyProf/CallStackPrinter.html +222 -215
- data/doc/RubyProf/CallTreePrinter.html +91 -142
- data/doc/RubyProf/Cmd.html +115 -157
- data/doc/RubyProf/DotPrinter.html +88 -140
- data/doc/RubyProf/FlatPrinter.html +66 -129
- data/doc/RubyProf/FlatPrinterWithLineNumbers.html +69 -132
- data/doc/RubyProf/GraphHtmlPrinter.html +115 -166
- data/doc/RubyProf/GraphPrinter.html +58 -125
- data/doc/RubyProf/MethodInfo.html +147 -172
- data/doc/RubyProf/MultiPrinter.html +104 -150
- data/doc/RubyProf/Profile.html +125 -179
- data/doc/RubyProf/ProfileTask.html +117 -157
- data/doc/RubyProf/Test.html +115 -154
- data/doc/RubyProf/Thread.html +87 -147
- data/doc/created.rid +13 -14
- data/doc/examples/flat_txt.html +51 -90
- data/doc/examples/graph_html.html +852 -0
- data/doc/examples/graph_txt.html +64 -92
- data/doc/fonts.css +167 -0
- data/doc/fonts/Lato-Light.ttf +0 -0
- data/doc/fonts/Lato-LightItalic.ttf +0 -0
- data/doc/fonts/Lato-Regular.ttf +0 -0
- data/doc/fonts/Lato-RegularItalic.ttf +0 -0
- data/doc/fonts/SourceCodePro-Bold.ttf +0 -0
- data/doc/fonts/SourceCodePro-Regular.ttf +0 -0
- data/doc/images/add.png +0 -0
- data/doc/images/arrow_up.png +0 -0
- data/doc/images/delete.png +0 -0
- data/doc/images/tag_blue.png +0 -0
- data/doc/index.html +75 -65
- data/doc/js/darkfish.js +0 -15
- data/doc/js/search.js +20 -5
- data/doc/js/search_index.js +1 -1
- data/doc/rdoc.css +255 -218
- data/doc/table_of_contents.html +751 -353
- data/ext/ruby_prof/extconf.rb +20 -22
- data/ext/ruby_prof/rp_measure_allocations.c +9 -5
- data/ext/ruby_prof/rp_measure_gc_runs.c +8 -0
- data/ext/ruby_prof/rp_measure_gc_time.c +5 -2
- data/ext/ruby_prof/rp_measure_wall_time.c +1 -0
- data/ext/ruby_prof/rp_method.c +0 -9
- data/ext/ruby_prof/rp_method.h +1 -6
- data/ext/ruby_prof/ruby_prof.c +32 -112
- data/ext/ruby_prof/ruby_prof.h +9 -10
- data/lib/ruby-prof.rb +2 -1
- data/lib/ruby-prof/aggregate_call_info.rb +4 -6
- data/lib/ruby-prof/call_info_visitor.rb +42 -44
- data/lib/ruby-prof/printers/graph_html_printer.rb +0 -8
- data/lib/ruby-prof/profile.rb +4 -4
- data/lib/ruby-prof/rack.rb +47 -47
- data/lib/ruby-prof/task.rb +0 -0
- data/lib/ruby-prof/thread.rb +22 -22
- data/lib/ruby-prof/version.rb +3 -0
- data/ruby-prof.gemspec +7 -11
- data/test/call_info_test.rb +78 -78
- data/test/call_info_visitor_test.rb +31 -31
- data/test/fiber_test.rb +2 -2
- data/test/measure_gc_runs_test.rb +1 -1
- data/test/measure_process_time_test.rb +7 -6
- data/test/printers_test.rb +4 -8
- data/test/recursive_test.rb +5 -9
- data/test/test_helper.rb +1 -1
- data/test/unique_call_path_test.rb +7 -29
- data/test/yarv_test.rb +55 -0
- metadata +63 -55
- data/ext/ruby_prof/version.h +0 -7
- data/lib/ruby-prof/test.rb +0 -150
- data/test/exec_test.rb +0 -14
- data/test/test_suite.rb +0 -37
data/ext/ruby_prof/ruby_prof.h
CHANGED
@@ -8,26 +8,25 @@
|
|
8
8
|
#include <stdio.h>
|
9
9
|
|
10
10
|
#if RUBY_VERSION == 186
|
11
|
-
# error 1.8.6 is not supported.
|
11
|
+
# error 1.8.6 is not supported. Please upgrade to 1.9.3 or higher.
|
12
|
+
#endif
|
13
|
+
|
14
|
+
#if RUBY_VERSION == 187
|
15
|
+
# error 1.8.7 is not supported. Please upgrade to 1.9.3 or higher.
|
12
16
|
#endif
|
13
17
|
|
14
18
|
#if RUBY_VERSION == 190
|
15
|
-
# error 1.9.0 is not supported.
|
19
|
+
# error 1.9.0 is not supported. Please upgrade to 1.9.3 or higher.
|
16
20
|
#endif
|
17
21
|
|
18
22
|
#if RUBY_VERSION == 191
|
19
|
-
# error 1.9.1 is not supported.
|
23
|
+
# error 1.9.1 is not supported. Please upgrade to 1.9.3 or higher.
|
20
24
|
#endif
|
21
25
|
|
22
|
-
#
|
23
|
-
#
|
24
|
-
typedef rb_event_t rb_event_flag_t;
|
25
|
-
#define rb_sourcefile() (node ? node->nd_file : 0)
|
26
|
-
#define rb_sourceline() (node ? nd_line(node) : 0)
|
26
|
+
#if RUBY_VERSION == 192
|
27
|
+
# error 1.9.2 is not supported. Please upgrade to 1.9.3 or higher.
|
27
28
|
#endif
|
28
29
|
|
29
|
-
#include "version.h"
|
30
|
-
|
31
30
|
#include "rp_measure.h"
|
32
31
|
#include "rp_method.h"
|
33
32
|
#include "rp_call_info.h"
|
data/lib/ruby-prof.rb
CHANGED
@@ -8,6 +8,7 @@ rescue LoadError
|
|
8
8
|
require "ruby_prof"
|
9
9
|
end
|
10
10
|
|
11
|
+
require 'ruby-prof/version'
|
11
12
|
require 'ruby-prof/aggregate_call_info'
|
12
13
|
require 'ruby-prof/call_info'
|
13
14
|
require 'ruby-prof/call_info_visitor'
|
@@ -64,4 +65,4 @@ module RubyProf
|
|
64
65
|
end
|
65
66
|
end
|
66
67
|
|
67
|
-
RubyProf::figure_measure_mode
|
68
|
+
RubyProf::figure_measure_mode
|
@@ -56,16 +56,14 @@ module RubyProf
|
|
56
56
|
private
|
57
57
|
|
58
58
|
def aggregate(method_name)
|
59
|
-
|
60
|
-
sum
|
61
|
-
sum
|
59
|
+
call_infos.inject(0) do |sum, call_info|
|
60
|
+
sum + call_info.send(method_name)
|
62
61
|
end
|
63
62
|
end
|
64
63
|
|
65
64
|
def aggregate_without_recursion(method_name)
|
66
|
-
|
67
|
-
sum
|
68
|
-
sum
|
65
|
+
call_infos.inject(0) do |sum, call_info|
|
66
|
+
call_info.recursive ? sum : sum + call_info.send(method_name)
|
69
67
|
end
|
70
68
|
end
|
71
69
|
end
|
@@ -1,44 +1,42 @@
|
|
1
|
-
# The call info visitor class does a depth-first traversal
|
2
|
-
# across a thread's call stack. At each call_info node,
|
3
|
-
# the visitor executes the block provided in the
|
4
|
-
# #visit method. The block is passed two parameters, the
|
5
|
-
# event and the call_info instance. Event will be
|
6
|
-
# either :enter or :exit.
|
7
|
-
#
|
8
|
-
# visitor = RubyProf::CallInfoVisitor.new(result.threads.first)
|
9
|
-
#
|
10
|
-
# method_names = Array.new
|
11
|
-
#
|
12
|
-
# visitor.visit do |call_info, event|
|
13
|
-
# method_names << call_info.target.full_name if event == :enter
|
14
|
-
# end
|
15
|
-
#
|
16
|
-
# puts method_names
|
17
|
-
|
18
|
-
module RubyProf
|
19
|
-
class CallInfoVisitor
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
end
|
44
|
-
end
|
1
|
+
# The call info visitor class does a depth-first traversal
|
2
|
+
# across a thread's call stack. At each call_info node,
|
3
|
+
# the visitor executes the block provided in the
|
4
|
+
# #visit method. The block is passed two parameters, the
|
5
|
+
# event and the call_info instance. Event will be
|
6
|
+
# either :enter or :exit.
|
7
|
+
#
|
8
|
+
# visitor = RubyProf::CallInfoVisitor.new(result.threads.first)
|
9
|
+
#
|
10
|
+
# method_names = Array.new
|
11
|
+
#
|
12
|
+
# visitor.visit do |call_info, event|
|
13
|
+
# method_names << call_info.target.full_name if event == :enter
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# puts method_names
|
17
|
+
|
18
|
+
module RubyProf
|
19
|
+
class CallInfoVisitor
|
20
|
+
|
21
|
+
def initialize(thread)
|
22
|
+
@thread = thread
|
23
|
+
end
|
24
|
+
|
25
|
+
def visit(&block)
|
26
|
+
@thread.top_methods.each do |method_info|
|
27
|
+
method_info.call_infos.each do |call_info|
|
28
|
+
visit_call_info(call_info, &block)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
def visit_call_info(call_info, &block)
|
35
|
+
yield call_info, :enter
|
36
|
+
call_info.children.each do |child|
|
37
|
+
visit_call_info(child, &block)
|
38
|
+
end
|
39
|
+
yield call_info, :exit
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -138,16 +138,12 @@ module RubyProf
|
|
138
138
|
<table>
|
139
139
|
<tr>
|
140
140
|
<th>Thread ID</th>
|
141
|
-
<% if RUBY_VERSION >= "1.9" %>
|
142
141
|
<th>Fiber ID</th>
|
143
|
-
<% end %>
|
144
142
|
<th>Total Time</th>
|
145
143
|
</tr>
|
146
144
|
<% for thread in @result.threads %>
|
147
145
|
<tr>
|
148
|
-
<% if RUBY_VERSION >= "1.9" %>
|
149
146
|
<td><%= thread.id %></td>
|
150
|
-
<% end %>
|
151
147
|
<td><a href="#<%= thread.fiber_id %>"><%= thread.fiber_id %></a></td>
|
152
148
|
<td><%= thread.total_time %></td>
|
153
149
|
</tr>
|
@@ -158,11 +154,7 @@ module RubyProf
|
|
158
154
|
<% for thread in @result.threads
|
159
155
|
methods = thread.methods
|
160
156
|
total_time = thread.total_time %>
|
161
|
-
<% if RUBY_VERSION >= "1.9" %>
|
162
157
|
<h2><a name="<%= thread.fiber_id %>">Thread <%= thread.id %>, Fiber: <%= thread.fiber_id %></a></h2>
|
163
|
-
<% else %>
|
164
|
-
<h2><a name="<%= thread.fiber_id %>">Thread <%= thread.fiber_id %></a></h2>
|
165
|
-
<% end %>
|
166
158
|
<table>
|
167
159
|
<thead>
|
168
160
|
<tr>
|
data/lib/ruby-prof/profile.rb
CHANGED
@@ -22,11 +22,11 @@ module RubyProf
|
|
22
22
|
visitor.visit do |call_info, event|
|
23
23
|
case event
|
24
24
|
when :enter
|
25
|
-
visited_methods[call_info.target] += 1
|
26
|
-
|
25
|
+
if (visited_methods[call_info.target] += 1) > 1
|
26
|
+
call_info.recursive = true
|
27
|
+
end
|
27
28
|
when :exit
|
28
|
-
visited_methods[call_info.target] -= 1
|
29
|
-
if visited_methods[call_info.target] == 0
|
29
|
+
if (visited_methods[call_info.target] -= 1) == 0
|
30
30
|
visited_methods.delete(call_info.target)
|
31
31
|
end
|
32
32
|
end
|
data/lib/ruby-prof/rack.rb
CHANGED
@@ -1,48 +1,48 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require 'tmpdir'
|
3
|
-
|
4
|
-
module Rack
|
5
|
-
class RubyProf
|
6
|
-
def initialize(app, options = {})
|
7
|
-
@app = app
|
8
|
-
@options = options
|
9
|
-
@options[:min_percent] ||= 1
|
10
|
-
@tmpdir = options[:path] || Dir.tmpdir
|
11
|
-
@printer_klasses = @options[:printers] || {::RubyProf::FlatPrinter => 'flat.txt',
|
12
|
-
::RubyProf::GraphPrinter => 'graph.txt',
|
13
|
-
::RubyProf::GraphHtmlPrinter => 'graph.html',
|
14
|
-
::RubyProf::CallStackPrinter => 'call_stack.html'}
|
15
|
-
|
16
|
-
@skip_paths = options[:skip_paths] || [%r{^/assets}, %r{\.css$}, %r{\.js$}, %r{\.png$}, %r{\.jpeg$}, %r{\.jpg$}, %r{\.gif$}]
|
17
|
-
end
|
18
|
-
|
19
|
-
def call(env)
|
20
|
-
request = Rack::Request.new(env)
|
21
|
-
|
22
|
-
if @skip_paths.any? {|skip_path| skip_path =~ request.path}
|
23
|
-
@app.call(env)
|
24
|
-
else
|
25
|
-
result = nil
|
26
|
-
data = ::RubyProf::Profile.profile do
|
27
|
-
result = @app.call(env)
|
28
|
-
end
|
29
|
-
|
30
|
-
path = request.path.gsub('/', '-')
|
31
|
-
path.slice!(0)
|
32
|
-
|
33
|
-
print(data, path)
|
34
|
-
result
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def print(data, path)
|
39
|
-
@printer_klasses.each do |printer_klass, base_name|
|
40
|
-
printer = printer_klass.new(data)
|
41
|
-
file_name = ::File.join(@tmpdir, "#{path}-#{base_name}")
|
42
|
-
::File.open(file_name, 'wb') do |file|
|
43
|
-
printer.print(file, @options)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'tmpdir'
|
3
|
+
|
4
|
+
module Rack
|
5
|
+
class RubyProf
|
6
|
+
def initialize(app, options = {})
|
7
|
+
@app = app
|
8
|
+
@options = options
|
9
|
+
@options[:min_percent] ||= 1
|
10
|
+
@tmpdir = options[:path] || Dir.tmpdir
|
11
|
+
@printer_klasses = @options[:printers] || {::RubyProf::FlatPrinter => 'flat.txt',
|
12
|
+
::RubyProf::GraphPrinter => 'graph.txt',
|
13
|
+
::RubyProf::GraphHtmlPrinter => 'graph.html',
|
14
|
+
::RubyProf::CallStackPrinter => 'call_stack.html'}
|
15
|
+
|
16
|
+
@skip_paths = options[:skip_paths] || [%r{^/assets}, %r{\.css$}, %r{\.js$}, %r{\.png$}, %r{\.jpeg$}, %r{\.jpg$}, %r{\.gif$}]
|
17
|
+
end
|
18
|
+
|
19
|
+
def call(env)
|
20
|
+
request = Rack::Request.new(env)
|
21
|
+
|
22
|
+
if @skip_paths.any? {|skip_path| skip_path =~ request.path}
|
23
|
+
@app.call(env)
|
24
|
+
else
|
25
|
+
result = nil
|
26
|
+
data = ::RubyProf::Profile.profile do
|
27
|
+
result = @app.call(env)
|
28
|
+
end
|
29
|
+
|
30
|
+
path = request.path.gsub('/', '-')
|
31
|
+
path.slice!(0)
|
32
|
+
|
33
|
+
print(data, path)
|
34
|
+
result
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def print(data, path)
|
39
|
+
@printer_klasses.each do |printer_klass, base_name|
|
40
|
+
printer = printer_klass.new(data)
|
41
|
+
file_name = ::File.join(@tmpdir, "#{path}-#{base_name}")
|
42
|
+
::File.open(file_name, 'wb') do |file|
|
43
|
+
printer.print(file, @options)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
48
|
end
|
data/lib/ruby-prof/task.rb
CHANGED
File without changes
|
data/lib/ruby-prof/thread.rb
CHANGED
@@ -1,22 +1,22 @@
|
|
1
|
-
module RubyProf
|
2
|
-
class Thread
|
3
|
-
def top_methods
|
4
|
-
self.methods.select do |method_info|
|
5
|
-
method_info.call_infos.detect do |call_info|
|
6
|
-
call_info.parent.nil?
|
7
|
-
end
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
def total_time
|
12
|
-
self.top_methods.inject(0) do |sum, method_info|
|
13
|
-
method_info.call_infos.each do |call_info|
|
14
|
-
if call_info.parent.nil?
|
15
|
-
sum += call_info.total_time
|
16
|
-
end
|
17
|
-
end
|
18
|
-
sum
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
1
|
+
module RubyProf
|
2
|
+
class Thread
|
3
|
+
def top_methods
|
4
|
+
self.methods.select do |method_info|
|
5
|
+
method_info.call_infos.detect do |call_info|
|
6
|
+
call_info.parent.nil?
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def total_time
|
12
|
+
self.top_methods.inject(0) do |sum, method_info|
|
13
|
+
method_info.call_infos.each do |call_info|
|
14
|
+
if call_info.parent.nil?
|
15
|
+
sum += call_info.total_time
|
16
|
+
end
|
17
|
+
end
|
18
|
+
sum
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/ruby-prof.gemspec
CHANGED
@@ -1,12 +1,7 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
#match = version_header.match(/RUBY_PROF_VERSION\s*"(\.+)"/)
|
6
|
-
match = version_header.match(/RUBY_PROF_VERSION\s*"([^"]+)"/)
|
7
|
-
raise(RuntimeError, "Could not determine RUBY_PROF_VERSION") if not match
|
8
|
-
|
9
|
-
RUBY_PROF_VERSION = "#{match[1]}"
|
3
|
+
$:.push File.expand_path("../lib", __FILE__)
|
4
|
+
require "ruby-prof/version"
|
10
5
|
|
11
6
|
Gem::Specification.new do |spec|
|
12
7
|
spec.name = "ruby-prof"
|
@@ -22,14 +17,14 @@ methods it called. RubyProf generate both text and html and can output
|
|
22
17
|
it to standard out or to a file.
|
23
18
|
EOF
|
24
19
|
|
25
|
-
spec.version =
|
20
|
+
spec.version = RubyProf::VERSION
|
26
21
|
|
27
22
|
spec.author = "Shugo Maeda, Charlie Savage, Roger Pack, Stefan Kaes"
|
28
23
|
spec.email = "shugo@ruby-lang.org, cfis@savagexi.com, rogerdpack@gmail.com, skaes@railsexpress.de"
|
29
24
|
spec.platform = Gem::Platform::RUBY
|
30
25
|
spec.require_path = "lib"
|
31
26
|
spec.bindir = "bin"
|
32
|
-
spec.executables = ["ruby-prof"]
|
27
|
+
spec.executables = ["ruby-prof", "ruby-prof-check-trace"]
|
33
28
|
spec.extensions = ["ext/ruby_prof/extconf.rb"]
|
34
29
|
spec.files = Dir['CHANGES',
|
35
30
|
'LICENSE',
|
@@ -37,6 +32,7 @@ EOF
|
|
37
32
|
'README.rdoc',
|
38
33
|
'ruby-prof.gemspec',
|
39
34
|
'bin/ruby-prof',
|
35
|
+
'bin/ruby-prof-check-trace',
|
40
36
|
'doc/**/*',
|
41
37
|
'examples/*',
|
42
38
|
'ext/ruby_prof/extconf.rb',
|
@@ -52,9 +48,9 @@ EOF
|
|
52
48
|
'test/*.rb']
|
53
49
|
|
54
50
|
spec.test_files = Dir["test/test_*.rb"]
|
55
|
-
spec.required_ruby_version = '>= 1.
|
51
|
+
spec.required_ruby_version = '>= 1.9.3'
|
56
52
|
spec.date = Time.now.strftime('%Y-%m-%d')
|
57
|
-
spec.homepage = 'https://github.com/
|
53
|
+
spec.homepage = 'https://github.com/ruby-prof/ruby-prof'
|
58
54
|
spec.add_development_dependency('minitest', '~> 4.0')
|
59
55
|
spec.add_development_dependency('rake-compiler')
|
60
56
|
spec.add_development_dependency('rdoc')
|
data/test/call_info_test.rb
CHANGED
@@ -1,78 +1,78 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# encoding: UTF-8
|
3
|
-
|
4
|
-
require File.expand_path('../test_helper', __FILE__)
|
5
|
-
|
6
|
-
class CallInfoTest < Test::Unit::TestCase
|
7
|
-
def setup
|
8
|
-
# Need to use wall time for this test due to the sleep calls
|
9
|
-
RubyProf::measure_mode = RubyProf::WALL_TIME
|
10
|
-
end
|
11
|
-
|
12
|
-
# def test_clone
|
13
|
-
# result = RubyProf.profile do
|
14
|
-
# RubyProf::C1.hello
|
15
|
-
# end
|
16
|
-
#
|
17
|
-
# method = result.threads.first.top_methods.first
|
18
|
-
# call_info = method.call_infos.first
|
19
|
-
# call_info_clone = call_info.clone
|
20
|
-
#
|
21
|
-
## assert_equal(call_info.target, call_info_clone.target)
|
22
|
-
# assert_equal(call_info.total_time, call_info_clone.total_time)
|
23
|
-
# end
|
24
|
-
|
25
|
-
def test_merge
|
26
|
-
result1 = RubyProf.profile do
|
27
|
-
RubyProf::C1.hello
|
28
|
-
end
|
29
|
-
|
30
|
-
methods = result1.threads.first.methods.sort.reverse
|
31
|
-
assert_equal(3, methods.length)
|
32
|
-
|
33
|
-
assert_equal('CallInfoTest#test_merge', methods[0].full_name)
|
34
|
-
assert_in_delta(0.1, methods[0].total_time, 0.01)
|
35
|
-
assert_in_delta(0, methods[0].wait_time, 0.01)
|
36
|
-
assert_in_delta(0, methods[0].self_time, 0.01)
|
37
|
-
assert_equal(1, methods[0].called)
|
38
|
-
|
39
|
-
assert_equal('<Class::RubyProf::C1>#hello', methods[1].full_name)
|
40
|
-
assert_in_delta(0.1, methods[1].total_time, 0.01)
|
41
|
-
assert_in_delta(0, methods[1].wait_time, 0.01)
|
42
|
-
assert_in_delta(0, methods[1].self_time, 0.01)
|
43
|
-
assert_equal(1, methods[1].called)
|
44
|
-
|
45
|
-
assert_equal('Kernel#sleep', methods[2].full_name)
|
46
|
-
assert_in_delta(0.1, methods[2].total_time, 0.01)
|
47
|
-
assert_in_delta(0, methods[2].wait_time, 0.01)
|
48
|
-
assert_in_delta(0.1, methods[2].self_time, 0.01)
|
49
|
-
assert_equal(1, methods[2].called)
|
50
|
-
|
51
|
-
|
52
|
-
RubyProf::C1.hello
|
53
|
-
end
|
54
|
-
|
55
|
-
# Merge the trees
|
56
|
-
methods = result1.threads.first.methods.sort.reverse
|
57
|
-
assert_equal(3, methods.length)
|
58
|
-
|
59
|
-
assert_equal('CallInfoTest#test_merge', methods[0].full_name)
|
60
|
-
assert_in_delta(0.1, methods[0].total_time, 0.01)
|
61
|
-
assert_in_delta(0, methods[0].wait_time, 0.01)
|
62
|
-
assert_in_delta(0, methods[0].self_time, 0.01)
|
63
|
-
assert_equal(1, methods[0].called)
|
64
|
-
|
65
|
-
assert_equal('<Class::RubyProf::C1>#hello', methods[1].full_name)
|
66
|
-
assert_in_delta(0.1, methods[1].total_time, 0.01)
|
67
|
-
assert_in_delta(0, methods[1].wait_time, 0.01)
|
68
|
-
assert_in_delta(0, methods[1].self_time, 0.01)
|
69
|
-
assert_equal(1, methods[1].called)
|
70
|
-
|
71
|
-
assert_equal('Kernel#sleep', methods[2].full_name)
|
72
|
-
assert_in_delta(0.1, methods[2].total_time, 0.01)
|
73
|
-
assert_in_delta(0, methods[2].wait_time, 0.01)
|
74
|
-
assert_in_delta(0.1, methods[2].self_time, 0.01)
|
75
|
-
assert_equal(1, methods[2].called)
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
require File.expand_path('../test_helper', __FILE__)
|
5
|
+
|
6
|
+
class CallInfoTest < Test::Unit::TestCase
|
7
|
+
def setup
|
8
|
+
# Need to use wall time for this test due to the sleep calls
|
9
|
+
RubyProf::measure_mode = RubyProf::WALL_TIME
|
10
|
+
end
|
11
|
+
|
12
|
+
# def test_clone
|
13
|
+
# result = RubyProf.profile do
|
14
|
+
# RubyProf::C1.hello
|
15
|
+
# end
|
16
|
+
#
|
17
|
+
# method = result.threads.first.top_methods.first
|
18
|
+
# call_info = method.call_infos.first
|
19
|
+
# call_info_clone = call_info.clone
|
20
|
+
#
|
21
|
+
## assert_equal(call_info.target, call_info_clone.target)
|
22
|
+
# assert_equal(call_info.total_time, call_info_clone.total_time)
|
23
|
+
# end
|
24
|
+
|
25
|
+
def test_merge
|
26
|
+
result1 = RubyProf.profile do
|
27
|
+
RubyProf::C1.hello
|
28
|
+
end
|
29
|
+
|
30
|
+
methods = result1.threads.first.methods.sort.reverse
|
31
|
+
assert_equal(3, methods.length)
|
32
|
+
|
33
|
+
assert_equal('CallInfoTest#test_merge', methods[0].full_name)
|
34
|
+
assert_in_delta(0.1, methods[0].total_time, 0.01)
|
35
|
+
assert_in_delta(0, methods[0].wait_time, 0.01)
|
36
|
+
assert_in_delta(0, methods[0].self_time, 0.01)
|
37
|
+
assert_equal(1, methods[0].called)
|
38
|
+
|
39
|
+
assert_equal('<Class::RubyProf::C1>#hello', methods[1].full_name)
|
40
|
+
assert_in_delta(0.1, methods[1].total_time, 0.01)
|
41
|
+
assert_in_delta(0, methods[1].wait_time, 0.01)
|
42
|
+
assert_in_delta(0, methods[1].self_time, 0.01)
|
43
|
+
assert_equal(1, methods[1].called)
|
44
|
+
|
45
|
+
assert_equal('Kernel#sleep', methods[2].full_name)
|
46
|
+
assert_in_delta(0.1, methods[2].total_time, 0.01)
|
47
|
+
assert_in_delta(0, methods[2].wait_time, 0.01)
|
48
|
+
assert_in_delta(0.1, methods[2].self_time, 0.01)
|
49
|
+
assert_equal(1, methods[2].called)
|
50
|
+
|
51
|
+
RubyProf.profile do
|
52
|
+
RubyProf::C1.hello
|
53
|
+
end
|
54
|
+
|
55
|
+
# Merge the trees
|
56
|
+
methods = result1.threads.first.methods.sort.reverse
|
57
|
+
assert_equal(3, methods.length)
|
58
|
+
|
59
|
+
assert_equal('CallInfoTest#test_merge', methods[0].full_name)
|
60
|
+
assert_in_delta(0.1, methods[0].total_time, 0.01)
|
61
|
+
assert_in_delta(0, methods[0].wait_time, 0.01)
|
62
|
+
assert_in_delta(0, methods[0].self_time, 0.01)
|
63
|
+
assert_equal(1, methods[0].called)
|
64
|
+
|
65
|
+
assert_equal('<Class::RubyProf::C1>#hello', methods[1].full_name)
|
66
|
+
assert_in_delta(0.1, methods[1].total_time, 0.01)
|
67
|
+
assert_in_delta(0, methods[1].wait_time, 0.01)
|
68
|
+
assert_in_delta(0, methods[1].self_time, 0.01)
|
69
|
+
assert_equal(1, methods[1].called)
|
70
|
+
|
71
|
+
assert_equal('Kernel#sleep', methods[2].full_name)
|
72
|
+
assert_in_delta(0.1, methods[2].total_time, 0.01)
|
73
|
+
assert_in_delta(0, methods[2].wait_time, 0.01)
|
74
|
+
assert_in_delta(0.1, methods[2].self_time, 0.01)
|
75
|
+
assert_equal(1, methods[2].called)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|