ruby-prof 0.11.0.rc3-x86-mingw32 → 0.11.2-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.
- data/CHANGES +28 -0
- data/Rakefile +1 -0
- data/bin/ruby-prof +57 -0
- data/ext/ruby_prof/rp_measure_allocations.c +9 -30
- data/ext/ruby_prof/rp_measure_gc_runs.c +11 -33
- data/ext/ruby_prof/rp_measure_gc_time.c +7 -19
- data/ext/ruby_prof/rp_measure_memory.c +20 -27
- data/ext/ruby_prof/rp_stack.c +17 -1
- data/ext/ruby_prof/rp_stack.h +8 -0
- data/ext/ruby_prof/ruby_prof.c +79 -16
- data/ext/ruby_prof/ruby_prof.h +2 -0
- data/ext/ruby_prof/vc/ruby_prof_18.vcxproj +3 -0
- data/ext/ruby_prof/version.h +2 -2
- data/lib/1.8/ruby_prof.so +0 -0
- data/lib/1.9/ruby_prof.so +0 -0
- data/lib/ruby-prof/compatibility.rb +43 -23
- data/lib/ruby-prof/printers/flat_printer.rb +1 -1
- data/lib/ruby-prof/printers/graph_html_printer.rb +1 -1
- data/lib/ruby-prof/printers/graph_printer.rb +1 -1
- data/ruby-prof.gemspec +1 -2
- data/test/basic_test.rb +55 -1
- data/test/line_number_test.rb +4 -6
- data/test/measure_cpu_time_test.rb +0 -3
- data/test/multi_printer_test.rb +0 -1
- data/test/pause_resume_test.rb +61 -0
- data/test/pause_test.rb +57 -0
- data/test/prime.rb +1 -1
- data/test/prime_test.rb +1 -1
- data/test/recursive_test.rb +9 -11
- data/test/test_suite.rb +2 -2
- data/test/thread_test.rb +5 -5
- data/test/unique_call_path_test.rb +0 -1
- metadata +8 -7
- data/test/summarize_test.rb +0 -48
data/ext/ruby_prof/ruby_prof.h
CHANGED
@@ -42,11 +42,13 @@ void method_key(prof_method_key_t* key, VALUE klass, ID mid);
|
|
42
42
|
typedef struct
|
43
43
|
{
|
44
44
|
VALUE running;
|
45
|
+
VALUE paused;
|
45
46
|
prof_measurer_t* measurer;
|
46
47
|
VALUE threads;
|
47
48
|
st_table* threads_tbl;
|
48
49
|
st_table* exclude_threads_tbl;
|
49
50
|
thread_data_t* last_thread_data;
|
51
|
+
double measurement_at_pause_resume;
|
50
52
|
} prof_profile_t;
|
51
53
|
|
52
54
|
|
@@ -64,6 +64,8 @@
|
|
64
64
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
65
65
|
<LinkIncremental>true</LinkIncremental>
|
66
66
|
<OutDir>C:\MinGW\local\src\ruby-prof\lib\1.8</OutDir>
|
67
|
+
<TargetExt>.so</TargetExt>
|
68
|
+
<TargetName>ruby_prof</TargetName>
|
67
69
|
</PropertyGroup>
|
68
70
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
69
71
|
<LinkIncremental>false</LinkIncremental>
|
@@ -81,6 +83,7 @@
|
|
81
83
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
82
84
|
<AdditionalLibraryDirectories>C:\MinGW\local\ruby187vc\lib</AdditionalLibraryDirectories>
|
83
85
|
<AdditionalDependencies>msvcr100-ruby18.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
86
|
+
<ModuleDefinitionFile>ruby_prof.def</ModuleDefinitionFile>
|
84
87
|
</Link>
|
85
88
|
</ItemDefinitionGroup>
|
86
89
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
data/ext/ruby_prof/version.h
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
/* Copyright (C) 2005-2011 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
|
-
#define RUBY_PROF_VERSION "0.11.
|
4
|
+
#define RUBY_PROF_VERSION "0.11.2" // for easy parsing from rake files
|
5
5
|
#define RUBY_PROF_VERSION_MAJ 0
|
6
6
|
#define RUBY_PROF_VERSION_MIN 11
|
7
|
-
#define RUBY_PROF_VERSION_MIC
|
7
|
+
#define RUBY_PROF_VERSION_MIC 2
|
data/lib/1.8/ruby_prof.so
CHANGED
Binary file
|
data/lib/1.9/ruby_prof.so
CHANGED
Binary file
|
@@ -18,7 +18,7 @@ module RubyProf
|
|
18
18
|
def self.measure_cpu_time
|
19
19
|
Measure::CpuTime.measure
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
def self.measure_gc_runs
|
23
23
|
Measure::GcRuns.measure
|
24
24
|
end
|
@@ -38,7 +38,7 @@ module RubyProf
|
|
38
38
|
def self.measure_wall_time
|
39
39
|
Measure::WallTime.measure
|
40
40
|
end
|
41
|
-
|
41
|
+
|
42
42
|
# call-seq:
|
43
43
|
# measure_mode -> measure_mode
|
44
44
|
#
|
@@ -51,11 +51,11 @@ module RubyProf
|
|
51
51
|
# *RubyProf::MEMORY - Measure memory size. This requires a patched Ruby interpreter.
|
52
52
|
# *RubyProf::GC_RUNS - Measure number of garbage collections. This requires a patched Ruby interpreter.
|
53
53
|
# *RubyProf::GC_TIME - Measure time spent doing garbage collection. This requires a patched Ruby interpreter.*/
|
54
|
-
|
54
|
+
|
55
55
|
def self.measure_mode
|
56
56
|
@measure_mode ||= RubyProf::WALL_TIME
|
57
57
|
end
|
58
|
-
|
58
|
+
|
59
59
|
# call-seq:
|
60
60
|
# measure_mode=value -> void
|
61
61
|
#
|
@@ -71,33 +71,31 @@ module RubyProf
|
|
71
71
|
def self.measure_mode=(value)
|
72
72
|
@measure_mode = value
|
73
73
|
end
|
74
|
-
|
74
|
+
|
75
75
|
# call-seq:
|
76
76
|
# exclude_threads= -> void
|
77
77
|
#
|
78
78
|
# Specifies what threads ruby-prof should exclude from profiling
|
79
|
-
|
79
|
+
|
80
80
|
def self.exclude_threads
|
81
81
|
@exclude_threads ||= Array.new
|
82
82
|
end
|
83
|
-
|
83
|
+
|
84
84
|
def self.exclude_threads=(value)
|
85
85
|
@exclude_threads = value
|
86
86
|
end
|
87
|
-
|
87
|
+
|
88
88
|
# Profiling
|
89
89
|
def self.start
|
90
|
-
|
91
|
-
raise(RuntimeError, "RubyProf is already running");
|
92
|
-
end
|
90
|
+
ensure_not_running!
|
93
91
|
@profile = Profile.new(self.measure_mode, self.exclude_threads)
|
92
|
+
enable_gc_stats_if_needed
|
94
93
|
@profile.start
|
95
94
|
end
|
96
95
|
|
97
96
|
def self.pause
|
98
|
-
|
99
|
-
|
100
|
-
end
|
97
|
+
ensure_running!
|
98
|
+
disable_gc_stats_if_needed
|
101
99
|
@profile.pause
|
102
100
|
end
|
103
101
|
|
@@ -110,25 +108,47 @@ module RubyProf
|
|
110
108
|
end
|
111
109
|
|
112
110
|
def self.resume
|
113
|
-
|
114
|
-
|
115
|
-
end
|
111
|
+
ensure_running!
|
112
|
+
enable_gc_stats_if_needed
|
116
113
|
@profile.resume
|
117
114
|
end
|
118
115
|
|
119
116
|
def self.stop
|
120
|
-
|
121
|
-
|
122
|
-
end
|
117
|
+
ensure_running!
|
118
|
+
disable_gc_stats_if_needed
|
123
119
|
result = @profile.stop
|
124
120
|
@profile = nil
|
125
121
|
result
|
126
122
|
end
|
127
123
|
|
124
|
+
# Profile a block
|
128
125
|
def self.profile(&block)
|
129
|
-
|
130
|
-
|
126
|
+
ensure_not_running!
|
127
|
+
gc_stat_was_enabled = enable_gc_stats_if_needed
|
128
|
+
res = Profile.profile(self.measure_mode, self.exclude_threads, &block)
|
129
|
+
disable_gc_stats_if_needed(gc_stat_was_enabled)
|
130
|
+
res
|
131
|
+
end
|
132
|
+
|
133
|
+
|
134
|
+
private
|
135
|
+
def self.ensure_running!
|
136
|
+
raise(RuntimeError, "RubyProf.start was not yet called") unless running?
|
137
|
+
end
|
138
|
+
|
139
|
+
def self.ensure_not_running!
|
140
|
+
raise(RuntimeError, "RubyProf is already running") if running?
|
141
|
+
end
|
142
|
+
|
143
|
+
# for GC.allocated_size to work GC statistics should be enabled
|
144
|
+
def self.enable_gc_stats_if_needed
|
145
|
+
if self.measure_mode == RubyProf::MEMORY && GC.respond_to?(:enable_stats)
|
146
|
+
@gc_stat_was_enabled = GC.enable_stats
|
131
147
|
end
|
132
|
-
|
148
|
+
end
|
149
|
+
|
150
|
+
def self.disable_gc_stats_if_needed(was_enabled=nil)
|
151
|
+
was_enabled ||= defined?(@gc_stat_was_enabled) && @gc_stat_was_enabled
|
152
|
+
GC.disable_stats if self.measure_mode == RubyProf::MEMORY && GC.respond_to?(:disable_stats) && !was_enabled
|
133
153
|
end
|
134
154
|
end
|
data/ruby-prof.gemspec
CHANGED
@@ -6,8 +6,7 @@ version_header = File.read(File.expand_path('../ext/ruby_prof/version.h', __FILE
|
|
6
6
|
match = version_header.match(/RUBY_PROF_VERSION\s*"([^"]+)"/)
|
7
7
|
raise(RuntimeError, "Could not determine RUBY_PROF_VERSION") if not match
|
8
8
|
|
9
|
-
|
10
|
-
RUBY_PROF_VERSION = "#{match[1]}.rc3"
|
9
|
+
RUBY_PROF_VERSION = "#{match[1]}"
|
11
10
|
|
12
11
|
Gem::Specification.new do |spec|
|
13
12
|
spec.name = "ruby-prof"
|
data/test/basic_test.rb
CHANGED
@@ -39,4 +39,58 @@ class BasicTest < Test::Unit::TestCase
|
|
39
39
|
|
40
40
|
RubyProf.stop
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
|
+
def test_pause_seq
|
44
|
+
p= RubyProf::Profile.new(RubyProf::WALL_TIME,[])
|
45
|
+
p.start ; assert !p.paused?
|
46
|
+
p.pause ; assert p.paused?
|
47
|
+
p.resume; assert !p.paused?
|
48
|
+
p.pause ; assert p.paused?
|
49
|
+
p.pause ; assert p.paused?
|
50
|
+
p.resume; assert !p.paused?
|
51
|
+
p.resume; assert !p.paused?
|
52
|
+
p.stop ; assert !p.paused?
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_pause_block
|
56
|
+
p= RubyProf::Profile.new(RubyProf::WALL_TIME,[])
|
57
|
+
p.start
|
58
|
+
p.pause
|
59
|
+
assert p.paused?
|
60
|
+
|
61
|
+
times_block_invoked = 0
|
62
|
+
retval= p.resume{
|
63
|
+
times_block_invoked += 1
|
64
|
+
120 + times_block_invoked
|
65
|
+
}
|
66
|
+
assert_equal 1, times_block_invoked
|
67
|
+
assert p.paused?
|
68
|
+
|
69
|
+
assert_equal 121, retval, "resume() should return the result of the given block."
|
70
|
+
|
71
|
+
p.stop
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_pause_block_with_error
|
75
|
+
p= RubyProf::Profile.new(RubyProf::WALL_TIME,[])
|
76
|
+
p.start
|
77
|
+
p.pause
|
78
|
+
assert p.paused?
|
79
|
+
|
80
|
+
begin
|
81
|
+
p.resume{ raise }
|
82
|
+
flunk 'Exception expected.'
|
83
|
+
rescue
|
84
|
+
assert p.paused?
|
85
|
+
end
|
86
|
+
|
87
|
+
p.stop
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_resume_when_not_paused
|
91
|
+
p= RubyProf::Profile.new(RubyProf::WALL_TIME,[])
|
92
|
+
p.start ; assert !p.paused?
|
93
|
+
p.resume; assert !p.paused?
|
94
|
+
p.stop ; assert !p.paused?
|
95
|
+
end
|
96
|
+
end
|
data/test/line_number_test.rb
CHANGED
@@ -5,11 +5,9 @@ require File.expand_path('../test_helper', __FILE__)
|
|
5
5
|
|
6
6
|
class LineNumbers
|
7
7
|
def method1
|
8
|
-
3
|
9
8
|
end
|
10
9
|
|
11
10
|
def method2
|
12
|
-
3
|
13
11
|
method1
|
14
12
|
end
|
15
13
|
|
@@ -32,11 +30,11 @@ class LineNumbersTest < Test::Unit::TestCase
|
|
32
30
|
|
33
31
|
method = methods[0]
|
34
32
|
assert_equal('LineNumbersTest#test_function_line_no', method.full_name)
|
35
|
-
assert_equal(
|
33
|
+
assert_equal(25, method.line)
|
36
34
|
|
37
35
|
method = methods[1]
|
38
36
|
assert_equal('LineNumbers#method2', method.full_name)
|
39
|
-
assert_equal(
|
37
|
+
assert_equal(10, method.line)
|
40
38
|
|
41
39
|
method = methods[2]
|
42
40
|
assert_equal('LineNumbers#method1', method.full_name)
|
@@ -64,10 +62,10 @@ class LineNumbersTest < Test::Unit::TestCase
|
|
64
62
|
|
65
63
|
method = methods[1]
|
66
64
|
assert_equal('LineNumbers#method3', method.full_name)
|
67
|
-
assert_equal(
|
65
|
+
assert_equal(14, method.line)
|
68
66
|
|
69
67
|
method = methods[2]
|
70
68
|
assert_equal('LineNumbersTest#test_c_function', method.full_name)
|
71
|
-
assert_equal(
|
69
|
+
assert_equal(48, method.line)
|
72
70
|
end
|
73
71
|
end
|
data/test/multi_printer_test.rb
CHANGED
@@ -0,0 +1,61 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
require File.expand_path('../test_helper', __FILE__)
|
5
|
+
|
6
|
+
class PauseResumeTest < Test::Unit::TestCase
|
7
|
+
|
8
|
+
# pause/resume in the same frame
|
9
|
+
def test_pause_resume_1
|
10
|
+
p= RubyProf::Profile.new(RubyProf::WALL_TIME,[])
|
11
|
+
|
12
|
+
p.start
|
13
|
+
method_1a
|
14
|
+
|
15
|
+
p.pause
|
16
|
+
method_1b
|
17
|
+
|
18
|
+
p.resume
|
19
|
+
method_1c
|
20
|
+
|
21
|
+
r= p.stop
|
22
|
+
assert_in_delta(0.6, r.threads[0].methods.select{|m| m.full_name =~ /test_pause_resume_1$/}[0].total_time, 0.05)
|
23
|
+
end
|
24
|
+
def method_1a; sleep 0.2 end
|
25
|
+
def method_1b; sleep 1 end
|
26
|
+
def method_1c; sleep 0.4 end
|
27
|
+
|
28
|
+
# pause in parent frame, resume in child
|
29
|
+
def test_pause_resume_2
|
30
|
+
p= RubyProf::Profile.new(RubyProf::WALL_TIME,[])
|
31
|
+
|
32
|
+
p.start
|
33
|
+
method_2a
|
34
|
+
|
35
|
+
p.pause
|
36
|
+
sleep 0.5
|
37
|
+
method_2b(p)
|
38
|
+
|
39
|
+
r= p.stop
|
40
|
+
assert_in_delta(0.6, r.threads[0].methods.select{|m| m.full_name =~ /test_pause_resume_2$/}[0].total_time, 0.05)
|
41
|
+
end
|
42
|
+
def method_2a; sleep 0.2 end
|
43
|
+
def method_2b(p); sleep 0.5; p.resume; sleep 0.4 end
|
44
|
+
|
45
|
+
# pause in child frame, resume in parent
|
46
|
+
def test_pause_resume_3
|
47
|
+
p= RubyProf::Profile.new(RubyProf::WALL_TIME,[])
|
48
|
+
|
49
|
+
p.start
|
50
|
+
method_3a(p)
|
51
|
+
|
52
|
+
sleep 0.5
|
53
|
+
p.resume
|
54
|
+
method_3b
|
55
|
+
|
56
|
+
r= p.stop
|
57
|
+
assert_in_delta(0.6, r.threads[0].methods.select{|m| m.full_name =~ /test_pause_resume_3$/}[0].total_time, 0.05)
|
58
|
+
end
|
59
|
+
def method_3a(p); sleep 0.2; p.pause; sleep 0.5 end
|
60
|
+
def method_3b; sleep 0.4 end
|
61
|
+
end
|
data/test/pause_test.rb
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
require File.expand_path('../test_helper', __FILE__)
|
5
|
+
|
6
|
+
class PauseTest < 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_pause_resume
|
13
|
+
RubyProf.start
|
14
|
+
# Measured
|
15
|
+
RubyProf::C1.hello
|
16
|
+
RubyProf.pause
|
17
|
+
|
18
|
+
# Not measured
|
19
|
+
RubyProf::C1.hello
|
20
|
+
|
21
|
+
RubyProf.resume
|
22
|
+
# Measured
|
23
|
+
RubyProf::C1.hello
|
24
|
+
result = RubyProf.stop
|
25
|
+
|
26
|
+
printer = RubyProf::FlatPrinter.new(result)
|
27
|
+
printer.print
|
28
|
+
|
29
|
+
# Length should be 3:
|
30
|
+
# PauseTest#test_pause_resume
|
31
|
+
# <Class::RubyProf::C1>#hello
|
32
|
+
# Kernel#sleep
|
33
|
+
|
34
|
+
methods = result.threads.first.methods.sort.reverse
|
35
|
+
assert_equal(3, methods.length)
|
36
|
+
|
37
|
+
# Check the names
|
38
|
+
assert_equal('PauseTest#test_pause_resume', methods[0].full_name)
|
39
|
+
assert_equal('<Class::RubyProf::C1>#hello', methods[1].full_name)
|
40
|
+
assert_equal('Kernel#sleep', methods[2].full_name)
|
41
|
+
|
42
|
+
# Check times
|
43
|
+
assert_in_delta(0.1, methods[0].total_time, 0.01)
|
44
|
+
assert_in_delta(0, methods[0].wait_time, 0.01)
|
45
|
+
assert_in_delta(0, methods[0].self_time, 0.01)
|
46
|
+
|
47
|
+
assert_in_delta(0.1, methods[1].total_time, 0.01)
|
48
|
+
assert_in_delta(0, methods[1].wait_time, 0.01)
|
49
|
+
assert_in_delta(0, methods[1].self_time, 0.01)
|
50
|
+
|
51
|
+
assert_in_delta(0.1, methods[2].total_time, 0.01)
|
52
|
+
assert_in_delta(0, methods[2].wait_time, 0.01)
|
53
|
+
assert_in_delta(0.1, methods[2].self_time, 0.01)
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|