ruby-prof 1.1.0-x64-mingw32 → 1.4.2-x64-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.
- checksums.yaml +4 -4
- data/CHANGES +48 -1
- data/Rakefile +2 -14
- data/bin/ruby-prof +100 -152
- data/ext/ruby_prof/extconf.rb +8 -28
- data/ext/ruby_prof/rp_aggregate_call_tree.c +59 -0
- data/ext/ruby_prof/rp_aggregate_call_tree.h +13 -0
- data/ext/ruby_prof/rp_allocation.c +67 -59
- data/ext/ruby_prof/rp_allocation.h +3 -3
- data/ext/ruby_prof/rp_call_tree.c +369 -0
- data/ext/ruby_prof/rp_call_tree.h +43 -0
- data/ext/ruby_prof/rp_call_trees.c +288 -0
- data/ext/ruby_prof/rp_call_trees.h +28 -0
- data/ext/ruby_prof/rp_measure_allocations.c +12 -14
- data/ext/ruby_prof/rp_measure_process_time.c +12 -14
- data/ext/ruby_prof/rp_measure_wall_time.c +17 -15
- data/ext/ruby_prof/rp_measurement.c +47 -40
- data/ext/ruby_prof/rp_measurement.h +7 -7
- data/ext/ruby_prof/rp_method.c +116 -255
- data/ext/ruby_prof/rp_method.h +31 -39
- data/ext/ruby_prof/rp_profile.c +316 -303
- data/ext/ruby_prof/rp_profile.h +1 -3
- data/ext/ruby_prof/rp_stack.c +122 -106
- data/ext/ruby_prof/rp_stack.h +17 -20
- data/ext/ruby_prof/rp_thread.c +136 -111
- data/ext/ruby_prof/rp_thread.h +12 -9
- data/ext/ruby_prof/ruby_prof.c +27 -23
- data/ext/ruby_prof/ruby_prof.h +9 -0
- data/ext/ruby_prof/vc/ruby_prof.sln +8 -0
- data/ext/ruby_prof/vc/ruby_prof.vcxproj +22 -7
- data/lib/2.7/ruby_prof.so +0 -0
- data/lib/ruby-prof.rb +5 -5
- data/lib/ruby-prof/assets/call_stack_printer.html.erb +4 -7
- data/lib/ruby-prof/assets/graph_printer.html.erb +5 -6
- data/lib/ruby-prof/{call_info.rb → call_tree.rb} +6 -6
- data/lib/ruby-prof/call_tree_visitor.rb +36 -0
- data/lib/ruby-prof/compatibility.rb +0 -10
- data/lib/ruby-prof/measurement.rb +5 -2
- data/lib/ruby-prof/method_info.rb +3 -15
- data/lib/ruby-prof/printers/abstract_printer.rb +12 -2
- data/lib/ruby-prof/printers/call_info_printer.rb +12 -10
- data/lib/ruby-prof/printers/call_stack_printer.rb +20 -22
- data/lib/ruby-prof/printers/call_tree_printer.rb +1 -1
- data/lib/ruby-prof/printers/dot_printer.rb +3 -3
- data/lib/ruby-prof/printers/flat_printer.rb +3 -2
- data/lib/ruby-prof/printers/graph_printer.rb +4 -5
- data/lib/ruby-prof/printers/multi_printer.rb +2 -2
- data/lib/ruby-prof/profile.rb +8 -4
- data/lib/ruby-prof/rack.rb +51 -127
- data/lib/ruby-prof/thread.rb +3 -18
- data/lib/ruby-prof/version.rb +1 -1
- data/ruby-prof.gemspec +7 -0
- data/test/alias_test.rb +42 -45
- data/test/basic_test.rb +0 -86
- data/test/{call_info_visitor_test.rb → call_tree_visitor_test.rb} +6 -5
- data/test/call_trees_test.rb +66 -0
- data/test/exclude_methods_test.rb +17 -12
- data/test/fiber_test.rb +95 -39
- data/test/gc_test.rb +36 -42
- data/test/inverse_call_tree_test.rb +175 -0
- data/test/line_number_test.rb +67 -70
- data/test/marshal_test.rb +7 -13
- data/test/measure_allocations_test.rb +224 -234
- data/test/measure_allocations_trace_test.rb +224 -234
- data/test/measure_memory_trace_test.rb +814 -469
- data/test/measure_process_time_test.rb +0 -64
- data/test/measure_times.rb +2 -0
- data/test/measure_wall_time_test.rb +34 -58
- data/test/pause_resume_test.rb +19 -10
- data/test/prime.rb +1 -3
- data/test/prime_script.rb +6 -0
- data/test/printer_call_stack_test.rb +0 -1
- data/test/printer_call_tree_test.rb +0 -1
- data/test/printer_flat_test.rb +61 -30
- data/test/printer_graph_html_test.rb +0 -1
- data/test/printer_graph_test.rb +3 -4
- data/test/printers_test.rb +2 -2
- data/test/printing_recursive_graph_test.rb +1 -1
- data/test/profile_test.rb +16 -0
- data/test/rack_test.rb +0 -64
- data/test/recursive_test.rb +50 -54
- data/test/start_stop_test.rb +19 -19
- data/test/test_helper.rb +6 -17
- data/test/thread_test.rb +11 -11
- data/test/unique_call_path_test.rb +25 -95
- metadata +22 -11
- data/ext/ruby_prof/rp_call_info.c +0 -271
- data/ext/ruby_prof/rp_call_info.h +0 -35
- data/lib/2.6.5/ruby_prof.so +0 -0
- data/lib/ruby-prof/call_info_visitor.rb +0 -38
- data/test/parser_timings.rb +0 -24
data/ext/ruby_prof/rp_thread.h
CHANGED
@@ -8,14 +8,14 @@
|
|
8
8
|
#include "rp_stack.h"
|
9
9
|
|
10
10
|
/* Profiling information for a thread. */
|
11
|
-
typedef struct
|
11
|
+
typedef struct thread_data_t
|
12
12
|
{
|
13
13
|
// Runtime
|
14
14
|
VALUE object; /* Cache to wrapped object */
|
15
15
|
VALUE fiber; /* Fiber */
|
16
16
|
prof_stack_t* stack; /* Stack of frames */
|
17
17
|
bool trace; /* Are we tracking this thread */
|
18
|
-
|
18
|
+
prof_call_tree_t* call_tree; /* The root of the call tree*/
|
19
19
|
VALUE thread_id; /* Thread id */
|
20
20
|
VALUE fiber_id; /* Fiber id */
|
21
21
|
VALUE methods; /* Array of RubyProf::MethodInfo */
|
@@ -23,13 +23,16 @@ typedef struct
|
|
23
23
|
} thread_data_t;
|
24
24
|
|
25
25
|
void rp_init_thread(void);
|
26
|
-
st_table
|
27
|
-
thread_data_t
|
28
|
-
thread_data_t* threads_table_insert(void
|
29
|
-
void
|
30
|
-
|
31
|
-
|
32
|
-
|
26
|
+
st_table* threads_table_create(void);
|
27
|
+
thread_data_t* threads_table_lookup(void* profile, VALUE fiber);
|
28
|
+
thread_data_t* threads_table_insert(void* profile, VALUE fiber);
|
29
|
+
void threads_table_free(st_table* table);
|
30
|
+
|
31
|
+
thread_data_t* prof_get_thread(VALUE self);
|
32
|
+
VALUE prof_thread_wrap(thread_data_t* thread);
|
33
|
+
void prof_thread_mark(void* data);
|
34
|
+
|
35
|
+
void switch_thread(void* profile, thread_data_t* thread_data, double measurement);
|
33
36
|
int pause_thread(st_data_t key, st_data_t value, st_data_t data);
|
34
37
|
int unpause_thread(st_data_t key, st_data_t value, st_data_t data);
|
35
38
|
|
data/ext/ruby_prof/ruby_prof.c
CHANGED
@@ -1,34 +1,36 @@
|
|
1
1
|
/* Copyright (C) 2005-2019 Shugo Maeda <shugo@ruby-lang.org> and Charlie Savage <cfis@savagexi.com>
|
2
2
|
Please see the LICENSE file for copyright and distribution information */
|
3
3
|
|
4
|
-
/* ruby-prof tracks the time spent executing every method in ruby programming.
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
*/
|
4
|
+
/* ruby-prof tracks the time spent executing every method in ruby programming.
|
5
|
+
The main players are:
|
6
|
+
|
7
|
+
profile_t - This represents 1 profile.
|
8
|
+
thread_data_t - Stores data about a single thread.
|
9
|
+
prof_stack_t - The method call stack in a particular thread
|
10
|
+
prof_method_t - Profiling information about each method
|
11
|
+
prof_call_tree_t - Keeps track a method's callers and callees.
|
12
|
+
|
13
|
+
The final result is an instance of a profile object which has a hash table of
|
14
|
+
thread_data_t, keyed on the thread id. Each thread in turn has a hash table
|
15
|
+
of prof_method_t, keyed on the method id. A hash table is used for quick
|
16
|
+
look up when doing a profile. However, it is exposed to Ruby as an array.
|
17
|
+
|
18
|
+
Each prof_method_t has two hash tables, parent and children, of prof_call_tree_t.
|
19
|
+
These objects keep track of a method's callers (who called the method) and its
|
20
|
+
callees (who the method called). These are keyed the method id, but once again,
|
21
|
+
are exposed to Ruby as arrays. Each prof_call_into_t maintains a pointer to the
|
22
|
+
caller or callee method, thereby making it easy to navigate through the call
|
23
|
+
hierarchy in ruby - which is very helpful for creating call graphs.
|
24
|
+
*/
|
25
25
|
|
26
26
|
#include "ruby_prof.h"
|
27
27
|
|
28
28
|
#include "rp_allocation.h"
|
29
29
|
#include "rp_measurement.h"
|
30
30
|
#include "rp_method.h"
|
31
|
-
#include "
|
31
|
+
#include "rp_call_tree.h"
|
32
|
+
#include "rp_aggregate_call_tree.h"
|
33
|
+
#include "rp_call_trees.h"
|
32
34
|
#include "rp_profile.h"
|
33
35
|
#include "rp_stack.h"
|
34
36
|
#include "rp_thread.h"
|
@@ -40,7 +42,9 @@ void Init_ruby_prof()
|
|
40
42
|
mProf = rb_define_module("RubyProf");
|
41
43
|
|
42
44
|
rp_init_allocation();
|
43
|
-
|
45
|
+
rp_init_call_tree();
|
46
|
+
rp_init_aggregate_call_tree();
|
47
|
+
rp_init_call_trees();
|
44
48
|
rp_init_measure();
|
45
49
|
rp_init_method_info();
|
46
50
|
rp_init_profile();
|
data/ext/ruby_prof/ruby_prof.h
CHANGED
@@ -9,6 +9,15 @@
|
|
9
9
|
#include <stdio.h>
|
10
10
|
#include <stdbool.h>
|
11
11
|
|
12
|
+
#ifndef rb_st_lookup
|
13
|
+
#define rb_st_foreach st_foreach
|
14
|
+
#define rb_st_free_table st_free_table
|
15
|
+
#define rb_st_init_numtable st_init_numtable
|
16
|
+
#define rb_st_insert st_insert
|
17
|
+
#define rb_st_lookup st_lookup
|
18
|
+
#endif
|
19
|
+
|
20
|
+
|
12
21
|
extern VALUE mProf;
|
13
22
|
|
14
23
|
// This method is not exposed in Ruby header files - at least not as of Ruby 2.6.3 :(
|
@@ -7,16 +7,24 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ruby_prof", "ruby_prof.vcxp
|
|
7
7
|
EndProject
|
8
8
|
Global
|
9
9
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
10
|
+
Debug|ARM = Debug|ARM
|
11
|
+
Debug|ARM64 = Debug|ARM64
|
10
12
|
Debug|x64 = Debug|x64
|
11
13
|
Debug|x86 = Debug|x86
|
14
|
+
Release|ARM = Release|ARM
|
15
|
+
Release|ARM64 = Release|ARM64
|
12
16
|
Release|x64 = Release|x64
|
13
17
|
Release|x86 = Release|x86
|
14
18
|
EndGlobalSection
|
15
19
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
20
|
+
{6B4978F4-3B5F-4D38-81A8-069EC28CC069}.Debug|ARM.ActiveCfg = Debug|Win32
|
21
|
+
{6B4978F4-3B5F-4D38-81A8-069EC28CC069}.Debug|ARM64.ActiveCfg = Debug|Win32
|
16
22
|
{6B4978F4-3B5F-4D38-81A8-069EC28CC069}.Debug|x64.ActiveCfg = Debug|x64
|
17
23
|
{6B4978F4-3B5F-4D38-81A8-069EC28CC069}.Debug|x64.Build.0 = Debug|x64
|
18
24
|
{6B4978F4-3B5F-4D38-81A8-069EC28CC069}.Debug|x86.ActiveCfg = Debug|Win32
|
19
25
|
{6B4978F4-3B5F-4D38-81A8-069EC28CC069}.Debug|x86.Build.0 = Debug|Win32
|
26
|
+
{6B4978F4-3B5F-4D38-81A8-069EC28CC069}.Release|ARM.ActiveCfg = Release|Win32
|
27
|
+
{6B4978F4-3B5F-4D38-81A8-069EC28CC069}.Release|ARM64.ActiveCfg = Release|Win32
|
20
28
|
{6B4978F4-3B5F-4D38-81A8-069EC28CC069}.Release|x64.ActiveCfg = Release|x64
|
21
29
|
{6B4978F4-3B5F-4D38-81A8-069EC28CC069}.Release|x64.Build.0 = Release|x64
|
22
30
|
{6B4978F4-3B5F-4D38-81A8-069EC28CC069}.Release|x86.ActiveCfg = Release|Win32
|
@@ -64,7 +64,7 @@
|
|
64
64
|
</PropertyGroup>
|
65
65
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
66
66
|
<TargetExt>.so</TargetExt>
|
67
|
-
<OutDir
|
67
|
+
<OutDir>..\..\..\lib\</OutDir>
|
68
68
|
</PropertyGroup>
|
69
69
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
70
70
|
<ClCompile>
|
@@ -102,30 +102,45 @@
|
|
102
102
|
</ItemDefinitionGroup>
|
103
103
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
104
104
|
<ClCompile>
|
105
|
-
<AdditionalIncludeDirectories>C:\msys64\usr\local\ruby-2.
|
105
|
+
<AdditionalIncludeDirectories>C:\msys64\usr\local\ruby-2.7.2vc\include\ruby-2.7.0\x64-mswin64_140;C:\msys64\usr\local\ruby-2.7.2vc\include\ruby-2.7.0;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
106
106
|
<Optimization>Disabled</Optimization>
|
107
107
|
<PreprocessorDefinitions>HAVE_RB_TRACEARG_CALLEE_ID;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
108
|
+
<WarningLevel>Level3</WarningLevel>
|
109
|
+
</ClCompile>
|
110
|
+
<Link>
|
111
|
+
<AdditionalLibraryDirectories>C:\msys64\usr\local\ruby-2.7.2vc\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
112
|
+
<AdditionalDependencies>x64-vcruntime140-ruby270.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
113
|
+
<ModuleDefinitionFile>ruby_prof.def</ModuleDefinitionFile>
|
114
|
+
<SubSystem>Console</SubSystem>
|
115
|
+
</Link>
|
116
|
+
</ItemDefinitionGroup>
|
117
|
+
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
118
|
+
<ClCompile>
|
119
|
+
<AdditionalIncludeDirectories>C:\msys64\usr\local\ruby-2.7.1vc\include\ruby-2.7.0\x64-mswin64_140;C:\msys64\usr\local\ruby-2.7.1vc\include\ruby-2.7.0;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
108
120
|
</ClCompile>
|
109
121
|
<Link>
|
110
|
-
<AdditionalLibraryDirectories>C:\msys64\usr\local\ruby-2.
|
111
|
-
<AdditionalDependencies>x64-vcruntime140-
|
122
|
+
<AdditionalLibraryDirectories>C:\msys64\usr\local\ruby-2.7.1vc\lib</AdditionalLibraryDirectories>
|
123
|
+
<AdditionalDependencies>x64-vcruntime140-ruby270.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
112
124
|
<ModuleDefinitionFile>ruby_prof.def</ModuleDefinitionFile>
|
113
125
|
</Link>
|
114
126
|
</ItemDefinitionGroup>
|
115
127
|
<ItemGroup>
|
128
|
+
<ClInclude Include="..\rp_aggregate_call_tree.h" />
|
116
129
|
<ClInclude Include="..\rp_allocation.h" />
|
117
|
-
<ClInclude Include="..\
|
130
|
+
<ClInclude Include="..\rp_call_tree.h" />
|
131
|
+
<ClInclude Include="..\rp_call_trees.h" />
|
118
132
|
<ClInclude Include="..\rp_measurement.h" />
|
119
133
|
<ClInclude Include="..\rp_method.h" />
|
120
134
|
<ClInclude Include="..\rp_profile.h" />
|
121
135
|
<ClInclude Include="..\rp_stack.h" />
|
122
136
|
<ClInclude Include="..\rp_thread.h" />
|
123
137
|
<ClInclude Include="..\ruby_prof.h" />
|
124
|
-
<ClInclude Include="..\version.h" />
|
125
138
|
</ItemGroup>
|
126
139
|
<ItemGroup>
|
140
|
+
<ClCompile Include="..\rp_aggregate_call_tree.c" />
|
127
141
|
<ClCompile Include="..\rp_allocation.c" />
|
128
|
-
<ClCompile Include="..\
|
142
|
+
<ClCompile Include="..\rp_call_tree.c" />
|
143
|
+
<ClCompile Include="..\rp_call_trees.c" />
|
129
144
|
<ClCompile Include="..\rp_measurement.c" />
|
130
145
|
<ClCompile Include="..\rp_measure_allocations.c" />
|
131
146
|
<ClCompile Include="..\rp_measure_memory.c" />
|
Binary file
|
data/lib/ruby-prof.rb
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
require 'rubygems/version'
|
2
3
|
|
3
4
|
# Load the C-based binding.
|
4
5
|
begin
|
5
|
-
|
6
|
-
require "#{
|
6
|
+
version = Gem::Version.new(RUBY_VERSION)
|
7
|
+
require "#{version.segments[0..1].join('.')}/ruby_prof.so"
|
7
8
|
rescue LoadError
|
8
9
|
require "ruby_prof.so"
|
9
10
|
end
|
10
11
|
|
11
12
|
require 'ruby-prof/version'
|
12
|
-
require 'ruby-prof/
|
13
|
+
require 'ruby-prof/call_tree'
|
13
14
|
require 'ruby-prof/compatibility'
|
14
15
|
require 'ruby-prof/measurement'
|
15
16
|
require 'ruby-prof/method_info'
|
@@ -18,8 +19,7 @@ require 'ruby-prof/rack'
|
|
18
19
|
require 'ruby-prof/thread'
|
19
20
|
|
20
21
|
module RubyProf
|
21
|
-
autoload :
|
22
|
-
|
22
|
+
autoload :CallTreeVisitor, 'ruby-prof/call_tree_visitor'
|
23
23
|
autoload :AbstractPrinter, 'ruby-prof/printers/abstract_printer'
|
24
24
|
autoload :CallInfoPrinter, 'ruby-prof/printers/call_info_printer'
|
25
25
|
autoload :CallStackPrinter, 'ruby-prof/printers/call_stack_printer'
|
@@ -697,13 +697,10 @@
|
|
697
697
|
<div class="thread">
|
698
698
|
<span>Thread: <%= thread.id %>, Fiber: <%= thread.fiber_id %> (<%= thread_info %>)</span>
|
699
699
|
<ul name="thread">
|
700
|
-
<%
|
701
|
-
|
702
|
-
|
703
|
-
|
704
|
-
print_stack(output, visited, call_info, call_info.total_time) %>
|
705
|
-
<%= output.string %>
|
706
|
-
<% end %>
|
700
|
+
<% visited = Set.new
|
701
|
+
output = StringIO.new('')
|
702
|
+
print_stack(output, visited, thread.call_tree, thread.call_tree.total_time) %>
|
703
|
+
<%= output.string %>
|
707
704
|
</ul>
|
708
705
|
</div>
|
709
706
|
<% end %>
|
@@ -217,8 +217,7 @@
|
|
217
217
|
self_percentage = (method.self_time/total_time) * 100 %>
|
218
218
|
|
219
219
|
<!-- Parents -->
|
220
|
-
<% for caller in method.callers.sort
|
221
|
-
next if method.root?
|
220
|
+
<% for caller in method.call_trees.callers.sort
|
222
221
|
next if min_time && caller.total_time < min_time %>
|
223
222
|
<tr>
|
224
223
|
<td> </td>
|
@@ -228,12 +227,12 @@
|
|
228
227
|
<td><%= sprintf("%.2f", caller.wait_time) %></td>
|
229
228
|
<td><%= sprintf("%.2f", caller.children_time) %></td>
|
230
229
|
<td><%= "#{caller.called}/#{method.called}" %></td>
|
231
|
-
<td class="method_name"><%= create_link(thread, total_time, caller.parent) %></td>
|
230
|
+
<td class="method_name"><%= create_link(thread, total_time, caller.parent.target) %></td>
|
232
231
|
<% if @result.track_allocations? %>
|
233
232
|
<td>-</td>
|
234
233
|
<% end %>
|
235
|
-
<td><%= if caller.parent.source_file
|
236
|
-
file_link(caller.parent.source_file, caller.line)
|
234
|
+
<td><%= if caller.parent.target.source_file
|
235
|
+
file_link(caller.parent.target.source_file, caller.line)
|
237
236
|
end %></td>
|
238
237
|
</tr>
|
239
238
|
<% end %>
|
@@ -293,7 +292,7 @@
|
|
293
292
|
<% end %>
|
294
293
|
|
295
294
|
<!-- Children -->
|
296
|
-
<% for callee in method.callees.sort_by(&:total_time).reverse
|
295
|
+
<% for callee in method.call_trees.callees.sort_by(&:total_time).reverse
|
297
296
|
next if min_time && callee.total_time < min_time %>
|
298
297
|
<tr>
|
299
298
|
<td> </td>
|
@@ -1,11 +1,11 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
module RubyProf
|
4
|
-
# The
|
4
|
+
# The CallTree class is used to track the relationships between methods. It is a helper class used by
|
5
5
|
# RubyProf::MethodInfo to keep track of which methods called a given method and which methods a given
|
6
|
-
# method called. Each
|
6
|
+
# method called. Each CallTree has a parent and target method. You cannot create a CallTree object directly,
|
7
7
|
# they are generated while running a profile.
|
8
|
-
class
|
8
|
+
class CallTree
|
9
9
|
# The number of times the parent method called the target method
|
10
10
|
def called
|
11
11
|
self.measurement.called
|
@@ -31,7 +31,7 @@ module RubyProf
|
|
31
31
|
self.total_time - self.self_time - self.wait_time
|
32
32
|
end
|
33
33
|
|
34
|
-
# Compares two
|
34
|
+
# Compares two CallTree instances. The comparison is based on the CallTree#parent, CallTree#target,
|
35
35
|
# and total time.
|
36
36
|
def <=>(other)
|
37
37
|
if self.target == other.target && self.parent == other.parent
|
@@ -47,11 +47,11 @@ module RubyProf
|
|
47
47
|
|
48
48
|
# :nodoc:
|
49
49
|
def to_s
|
50
|
-
"
|
50
|
+
"<#{self.class.name} - #{self.target.full_name}>"
|
51
51
|
end
|
52
52
|
|
53
53
|
def inspect
|
54
|
-
|
54
|
+
self.to_s
|
55
55
|
end
|
56
56
|
end
|
57
57
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module RubyProf
|
2
|
+
# The call info visitor class does a depth-first traversal across a
|
3
|
+
# list of call infos. At each call_tree node, the visitor executes
|
4
|
+
# the block provided in the #visit method. The block is passed two
|
5
|
+
# parameters, the event and the call_tree instance. Event will be
|
6
|
+
# either :enter or :exit.
|
7
|
+
#
|
8
|
+
# visitor = RubyProf::CallTreeVisitor.new(result.threads.first.call_tree)
|
9
|
+
#
|
10
|
+
# method_names = Array.new
|
11
|
+
#
|
12
|
+
# visitor.visit do |call_tree, event|
|
13
|
+
# method_names << call_tree.target.full_name if event == :enter
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# puts method_names
|
17
|
+
class CallTreeVisitor
|
18
|
+
def initialize(call_tree)
|
19
|
+
@call_tree = call_tree
|
20
|
+
end
|
21
|
+
|
22
|
+
def visit(&block)
|
23
|
+
visit_call_tree(@call_tree, &block)
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def visit_call_tree(call_tree, &block)
|
29
|
+
yield call_tree, :enter
|
30
|
+
call_tree.children.each do |child|
|
31
|
+
visit_call_tree(child, &block)
|
32
|
+
end
|
33
|
+
yield call_tree, :exit
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -81,16 +81,6 @@ module RubyProf
|
|
81
81
|
Profile.profile(options, &block)
|
82
82
|
end
|
83
83
|
|
84
|
-
# :nodoc:
|
85
|
-
def self.measure_mode_string
|
86
|
-
case measure_mode
|
87
|
-
when WALL_TIME then "wall_time"
|
88
|
-
when PROCESS_TIME then "process_time"
|
89
|
-
when ALLOCATIONS then "allocations"
|
90
|
-
when MEMORY then "memory"
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
84
|
# :nodoc:
|
95
85
|
def self.start_script(script)
|
96
86
|
start
|
@@ -1,8 +1,11 @@
|
|
1
1
|
module RubyProf
|
2
2
|
# The Measurement class is a helper class used by RubyProf::MethodInfo to store information about the method.
|
3
|
-
# You cannot create a
|
3
|
+
# You cannot create a CallTree object directly, they are generated while running a profile.
|
4
4
|
class Measurement
|
5
|
-
|
5
|
+
def children_time
|
6
|
+
self.total_time - self.self_time - self.wait_time
|
7
|
+
end
|
8
|
+
|
6
9
|
def to_s
|
7
10
|
"c: #{called}, tt: #{total_time}, st: #{self_time}"
|
8
11
|
end
|
@@ -52,14 +52,9 @@ module RubyProf
|
|
52
52
|
self.total_time - self.self_time - self.wait_time
|
53
53
|
end
|
54
54
|
|
55
|
-
# The min call depth of this method
|
56
|
-
def min_depth
|
57
|
-
@min_depth ||= callers.map(&:depth).min
|
58
|
-
end
|
59
|
-
|
60
55
|
# :enddoc:
|
61
56
|
def <=>(other)
|
62
|
-
if other
|
57
|
+
if other.nil?
|
63
58
|
-1
|
64
59
|
elsif self.full_name == other.full_name
|
65
60
|
0
|
@@ -67,9 +62,9 @@ module RubyProf
|
|
67
62
|
-1
|
68
63
|
elsif self.total_time > other.total_time
|
69
64
|
1
|
70
|
-
elsif self.min_depth < other.min_depth
|
65
|
+
elsif self.call_trees.min_depth < other.call_trees.min_depth
|
71
66
|
1
|
72
|
-
elsif self.min_depth > other.min_depth
|
67
|
+
elsif self.call_trees.min_depth > other.call_trees.min_depth
|
73
68
|
-1
|
74
69
|
else
|
75
70
|
self.full_name <=> other.full_name
|
@@ -79,12 +74,5 @@ module RubyProf
|
|
79
74
|
def to_s
|
80
75
|
"#{self.full_name} (c: #{self.called}, tt: #{self.total_time}, st: #{self.self_time}, wt: #{wait_time}, ct: #{self.children_time})"
|
81
76
|
end
|
82
|
-
|
83
|
-
# Remove method from the call graph. should not be called directly.
|
84
|
-
def eliminate!
|
85
|
-
# $stderr.puts "eliminating #{self}"
|
86
|
-
callers.each{ |call_info| call_info.eliminate! }
|
87
|
-
callers.clear
|
88
|
-
end
|
89
77
|
end
|
90
78
|
end
|