ruby-prof 0.6.0-x86-mswin32-60 → 0.7.0-x86-mswin32-60
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 +54 -1
- data/README +134 -7
- data/Rakefile +40 -58
- data/bin/ruby-prof +21 -6
- data/ext/extconf.rb +13 -0
- data/ext/measure_allocations.h +16 -1
- data/ext/measure_cpu_time.h +15 -3
- data/ext/measure_gc_runs.h +76 -0
- data/ext/measure_gc_time.h +57 -0
- data/ext/measure_memory.h +61 -2
- data/ext/measure_process_time.h +13 -2
- data/ext/measure_wall_time.h +12 -1
- data/ext/mingw/Rakefile +23 -0
- data/ext/mingw/build.rake +38 -0
- data/ext/mingw/ruby_prof.so +0 -0
- data/ext/ruby_prof.c +685 -633
- data/ext/ruby_prof.h +188 -0
- data/ext/vc/ruby_prof.sln +20 -0
- data/ext/vc/ruby_prof.vcproj +241 -0
- data/ext/version.h +4 -0
- data/lib/ruby-prof.rb +4 -0
- data/lib/ruby-prof/call_info.rb +47 -0
- data/lib/ruby-prof/call_tree_printer.rb +9 -1
- data/lib/ruby-prof/graph_html_printer.rb +6 -5
- data/lib/ruby-prof/graph_printer.rb +3 -2
- data/lib/ruby-prof/method_info.rb +85 -0
- data/lib/ruby-prof/task.rb +1 -2
- data/lib/ruby-prof/test.rb +148 -0
- data/rails/environment/profile.rb +24 -0
- data/rails/example/example_test.rb +9 -0
- data/rails/profile_test_helper.rb +21 -0
- data/test/basic_test.rb +173 -80
- data/test/duplicate_names_test.rb +2 -3
- data/test/exceptions_test.rb +15 -0
- data/test/exclude_threads_test.rb +54 -0
- data/test/line_number_test.rb +18 -14
- data/test/measurement_test.rb +121 -0
- data/test/module_test.rb +5 -8
- data/test/no_method_class_test.rb +4 -5
- data/test/prime.rb +3 -5
- data/test/prime_test.rb +1 -12
- data/test/printers_test.rb +10 -13
- data/test/profile_unit_test.rb +10 -12
- data/test/recursive_test.rb +202 -92
- data/test/singleton_test.rb +1 -2
- data/test/stack_test.rb +138 -0
- data/test/start_stop_test.rb +95 -0
- data/test/test_suite.rb +7 -3
- data/test/thread_test.rb +111 -87
- data/test/unique_call_path_test.rb +206 -0
- metadata +42 -44
- data/ext/extconf.rb.rej +0 -13
- data/lib/ruby-prof/call_tree_printer.rb.rej +0 -27
- data/lib/ruby-prof/profile_test_case.rb +0 -80
- data/lib/ruby_prof.so +0 -0
- data/rails_plugin/ruby-prof/init.rb +0 -8
- data/rails_plugin/ruby-prof/lib/profiling.rb +0 -57
- data/test/measure_mode_test.rb +0 -79
- data/test/prime1.rb +0 -17
- data/test/prime2.rb +0 -26
- data/test/prime3.rb +0 -17
- data/test/start_test.rb +0 -24
- data/test/test_helper.rb +0 -55
- data/test/timing_test.rb +0 -133
@@ -2,7 +2,6 @@
|
|
2
2
|
|
3
3
|
require 'test/unit'
|
4
4
|
require 'ruby-prof'
|
5
|
-
require 'test_helper'
|
6
5
|
|
7
6
|
class DuplicateNames < Test::Unit::TestCase
|
8
7
|
def test_names
|
@@ -22,12 +21,12 @@ class DuplicateNames < Test::Unit::TestCase
|
|
22
21
|
end
|
23
22
|
|
24
23
|
# There should be 3 foo methods
|
25
|
-
methods = result.threads.values.first
|
24
|
+
methods = result.threads.values.first.sort.reverse
|
26
25
|
|
27
26
|
methods = methods.select do |method|
|
28
27
|
method.full_name == 'DuplicateNames::Foo::Bar#foo'
|
29
28
|
end
|
30
|
-
|
29
|
+
|
31
30
|
assert_equal(3, methods.length)
|
32
31
|
end
|
33
32
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'test/unit'
|
3
|
+
require 'ruby-prof'
|
4
|
+
|
5
|
+
class ExceptionsTest < Test::Unit::TestCase
|
6
|
+
def test_profile
|
7
|
+
result = begin
|
8
|
+
RubyProf.profile do
|
9
|
+
raise(RuntimeError, 'Test error')
|
10
|
+
end
|
11
|
+
rescue => e
|
12
|
+
end
|
13
|
+
assert_not_nil(result)
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'ruby-prof'
|
5
|
+
|
6
|
+
|
7
|
+
# -- Tests ----
|
8
|
+
class ExcludeThreadsTest < Test::Unit::TestCase
|
9
|
+
def test_exclude_threads
|
10
|
+
|
11
|
+
def thread1_proc
|
12
|
+
sleep(0.5)
|
13
|
+
sleep(2)
|
14
|
+
end
|
15
|
+
|
16
|
+
def thread2_proc
|
17
|
+
sleep(0.5)
|
18
|
+
sleep(2)
|
19
|
+
end
|
20
|
+
|
21
|
+
thread1 = Thread.new do
|
22
|
+
thread1_proc
|
23
|
+
end
|
24
|
+
|
25
|
+
thread2 = Thread.new do
|
26
|
+
thread2_proc
|
27
|
+
end
|
28
|
+
|
29
|
+
RubyProf::exclude_threads = [ thread2 ]
|
30
|
+
|
31
|
+
RubyProf.start
|
32
|
+
|
33
|
+
thread1.join
|
34
|
+
thread2.join
|
35
|
+
|
36
|
+
result = RubyProf.stop
|
37
|
+
|
38
|
+
RubyProf::exclude_threads = nil
|
39
|
+
|
40
|
+
assert_equal(2, result.threads.length)
|
41
|
+
|
42
|
+
output = Array.new
|
43
|
+
result.threads.each do | thread_id, methods |
|
44
|
+
methods.each do | m |
|
45
|
+
if m.full_name.index("ExcludeThreadsTest#thread") == 0
|
46
|
+
output.push(m.full_name)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
assert_equal(1, output.length)
|
52
|
+
assert_equal("ExcludeThreadsTest#thread1_proc", output[0])
|
53
|
+
end
|
54
|
+
end
|
data/test/line_number_test.rb
CHANGED
@@ -1,9 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
|
3
2
|
require 'test/unit'
|
4
3
|
require 'ruby-prof'
|
5
4
|
require 'prime'
|
6
|
-
require 'test_helper'
|
7
5
|
|
8
6
|
class LineNumbers
|
9
7
|
def method1
|
@@ -11,6 +9,7 @@ class LineNumbers
|
|
11
9
|
end
|
12
10
|
|
13
11
|
def method2
|
12
|
+
a = 3
|
14
13
|
method1
|
15
14
|
end
|
16
15
|
|
@@ -33,15 +32,15 @@ class LineNumbersTest < Test::Unit::TestCase
|
|
33
32
|
|
34
33
|
method = methods[0]
|
35
34
|
assert_equal('LineNumbersTest#test_function_line_no', method.full_name)
|
36
|
-
assert_equal(
|
35
|
+
assert_equal(27, method.line)
|
37
36
|
|
38
37
|
method = methods[1]
|
39
|
-
assert_equal('LineNumbers#
|
40
|
-
assert_equal(
|
38
|
+
assert_equal('LineNumbers#method2', method.full_name)
|
39
|
+
assert_equal(11, method.line)
|
41
40
|
|
42
41
|
method = methods[2]
|
43
|
-
assert_equal('LineNumbers#
|
44
|
-
assert_equal(
|
42
|
+
assert_equal('LineNumbers#method1', method.full_name)
|
43
|
+
assert_equal(7, method.line)
|
45
44
|
end
|
46
45
|
|
47
46
|
def test_c_function
|
@@ -51,19 +50,24 @@ class LineNumbersTest < Test::Unit::TestCase
|
|
51
50
|
numbers.method3
|
52
51
|
end
|
53
52
|
|
54
|
-
methods = result.threads.values.first.
|
53
|
+
methods = result.threads.values.first.sort_by {|method| method.full_name}
|
55
54
|
assert_equal(3, methods.length)
|
56
|
-
|
55
|
+
|
56
|
+
# Methods:
|
57
|
+
# LineNumbers#method3
|
58
|
+
# LineNumbersTest#test_c_function
|
59
|
+
# Kernel#sleep
|
60
|
+
|
57
61
|
method = methods[0]
|
58
|
-
assert_equal('
|
59
|
-
assert_equal(
|
62
|
+
assert_equal('Kernel#sleep', method.full_name)
|
63
|
+
assert_equal(0, method.line)
|
60
64
|
|
61
65
|
method = methods[1]
|
62
66
|
assert_equal('LineNumbers#method3', method.full_name)
|
63
|
-
assert_equal(
|
67
|
+
assert_equal(16, method.line)
|
64
68
|
|
65
69
|
method = methods[2]
|
66
|
-
assert_equal('
|
67
|
-
assert_equal(
|
70
|
+
assert_equal('LineNumbersTest#test_c_function', method.full_name)
|
71
|
+
assert_equal(50, method.line)
|
68
72
|
end
|
69
73
|
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'test/unit'
|
3
|
+
require 'ruby-prof'
|
4
|
+
|
5
|
+
class MeasurementTest < Test::Unit::TestCase
|
6
|
+
def setup
|
7
|
+
GC.enable_stats if GC.respond_to?(:enable_stats)
|
8
|
+
end
|
9
|
+
|
10
|
+
def teardown
|
11
|
+
GC.disable_stats if GC.respond_to?(:disable_stats)
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_process_time_mode
|
15
|
+
RubyProf::measure_mode = RubyProf::PROCESS_TIME
|
16
|
+
assert_equal(RubyProf::PROCESS_TIME, RubyProf::measure_mode)
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_process_time
|
20
|
+
t = RubyProf.measure_process_time
|
21
|
+
assert_kind_of(Float, t)
|
22
|
+
|
23
|
+
u = RubyProf.measure_process_time
|
24
|
+
assert(u >= t, [t, u].inspect)
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_wall_time_mode
|
28
|
+
RubyProf::measure_mode = RubyProf::WALL_TIME
|
29
|
+
assert_equal(RubyProf::WALL_TIME, RubyProf::measure_mode)
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_wall_time
|
33
|
+
t = RubyProf.measure_wall_time
|
34
|
+
assert_kind_of Float, t
|
35
|
+
|
36
|
+
u = RubyProf.measure_wall_time
|
37
|
+
assert u >= t, [t, u].inspect
|
38
|
+
end
|
39
|
+
|
40
|
+
if RubyProf::CPU_TIME
|
41
|
+
def test_cpu_time_mode
|
42
|
+
RubyProf::measure_mode = RubyProf::CPU_TIME
|
43
|
+
assert_equal(RubyProf::CPU_TIME, RubyProf::measure_mode)
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_cpu_time
|
47
|
+
RubyProf.cpu_frequency = 2.33e9
|
48
|
+
|
49
|
+
t = RubyProf.measure_cpu_time
|
50
|
+
assert_kind_of Float, t
|
51
|
+
|
52
|
+
u = RubyProf.measure_cpu_time
|
53
|
+
assert u > t, [t, u].inspect
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
if RubyProf::ALLOCATIONS
|
58
|
+
def test_allocations_mode
|
59
|
+
RubyProf::measure_mode = RubyProf::ALLOCATIONS
|
60
|
+
assert_equal(RubyProf::ALLOCATIONS, RubyProf::measure_mode)
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_allocations
|
64
|
+
t = RubyProf.measure_allocations
|
65
|
+
assert_kind_of Integer, t
|
66
|
+
|
67
|
+
u = RubyProf.measure_allocations
|
68
|
+
assert u > t, [t, u].inspect
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
if RubyProf::MEMORY
|
73
|
+
def test_memory_mode
|
74
|
+
RubyProf::measure_mode = RubyProf::MEMORY
|
75
|
+
assert_equal(RubyProf::MEMORY, RubyProf::measure_mode)
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_memory
|
79
|
+
t = RubyProf.measure_memory
|
80
|
+
assert_kind_of Integer, t
|
81
|
+
|
82
|
+
u = RubyProf.measure_memory
|
83
|
+
assert(u >= t, [t, u].inspect)
|
84
|
+
|
85
|
+
result = RubyProf.profile {Array.new}
|
86
|
+
total = result.threads.values.first.methods.inject(0) { |sum, m| sum + m.total_time }
|
87
|
+
|
88
|
+
assert(total > 0, 'Should measure more than zero kilobytes of memory usage')
|
89
|
+
assert_not_equal(0, total % 1, 'Should not truncate fractional kilobyte measurements')
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
if RubyProf::GC_RUNS
|
94
|
+
def test_gc_runs_mode
|
95
|
+
RubyProf::measure_mode = RubyProf::GC_RUNS
|
96
|
+
assert_equal(RubyProf::GC_RUNS, RubyProf::measure_mode)
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_gc_runs
|
100
|
+
t = RubyProf.measure_gc_runs
|
101
|
+
assert_kind_of Integer, t
|
102
|
+
|
103
|
+
GC.start
|
104
|
+
|
105
|
+
u = RubyProf.measure_gc_runs
|
106
|
+
assert u > t, [t, u].inspect
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
if RubyProf::GC_TIME
|
111
|
+
def test_gc_time
|
112
|
+
t = RubyProf.measure_gc_time
|
113
|
+
assert_kind_of Integer, t
|
114
|
+
|
115
|
+
GC.start
|
116
|
+
|
117
|
+
u = RubyProf.measure_gc_time
|
118
|
+
assert u > t, [t, u].inspect
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
data/test/module_test.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
|
3
2
|
require 'test/unit'
|
4
3
|
require 'ruby-prof'
|
5
|
-
require 'test_helper'
|
6
4
|
|
7
5
|
# Need to use wall time for this test due to the sleep calls
|
8
6
|
RubyProf::measure_mode = RubyProf::WALL_TIME
|
@@ -33,20 +31,19 @@ class ModuleTest < Test::Unit::TestCase
|
|
33
31
|
hello
|
34
32
|
end
|
35
33
|
|
36
|
-
methods = result.threads.values.first
|
37
|
-
methods = methods.sort.reverse
|
34
|
+
methods = result.threads.values.first.sort.reverse
|
38
35
|
|
39
|
-
# Length should be
|
36
|
+
# Length should be 5
|
40
37
|
assert_equal(5, methods.length)
|
41
38
|
|
42
39
|
method = methods[0]
|
43
40
|
assert_equal('ModuleTest#test_nested_modules', method.full_name)
|
44
41
|
|
45
42
|
method = methods[1]
|
46
|
-
assert_equal('Kernel#sleep', method.full_name)
|
47
|
-
|
48
|
-
method = methods[2]
|
49
43
|
assert_equal('Bar#hello', method.full_name)
|
44
|
+
|
45
|
+
method = methods[2]
|
46
|
+
assert_equal('Kernel#sleep', method.full_name)
|
50
47
|
|
51
48
|
method = methods[3]
|
52
49
|
assert_equal('<Module::Bar>#hello', method.full_name)
|
@@ -1,5 +1,4 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
|
3
2
|
require 'ruby-prof'
|
4
3
|
|
5
4
|
# Make sure this works with no class or method
|
@@ -7,8 +6,8 @@ result = RubyProf.profile do
|
|
7
6
|
sleep 1
|
8
7
|
end
|
9
8
|
|
10
|
-
|
11
|
-
|
12
|
-
if
|
13
|
-
raise(RuntimeError, "Wrong method name. Expected: Global#[No method]. Actual: #{
|
9
|
+
methods = result.threads.values.first
|
10
|
+
global_method = methods.sort_by {|method| method.full_name}.first
|
11
|
+
if global_method.full_name != 'Global#[No method]'
|
12
|
+
raise(RuntimeError, "Wrong method name. Expected: Global#[No method]. Actual: #{global_method.full_name}")
|
14
13
|
end
|
data/test/prime.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# A silly little test program that finds prime numbers. It
|
2
2
|
# is intentionally badly designed to show off the use
|
3
|
-
#
|
3
|
+
# of ruby-prof.
|
4
4
|
#
|
5
5
|
# Source from http://people.cs.uchicago.edu/~bomb154/154/maclabs/profilers-lab/
|
6
6
|
|
@@ -44,7 +44,7 @@ def find_largest(primes)
|
|
44
44
|
end
|
45
45
|
|
46
46
|
def run_primes
|
47
|
-
length =
|
47
|
+
length = 10
|
48
48
|
maxnum = 10000
|
49
49
|
|
50
50
|
# Create random numbers
|
@@ -55,6 +55,4 @@ def run_primes
|
|
55
55
|
|
56
56
|
# Find the largest primes
|
57
57
|
largest = find_largest(primes)
|
58
|
-
end
|
59
|
-
|
60
|
-
run_primes
|
58
|
+
end
|
data/test/prime_test.rb
CHANGED
@@ -1,24 +1,13 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
|
3
2
|
require 'test/unit'
|
4
3
|
require 'ruby-prof'
|
5
4
|
require 'prime'
|
6
|
-
require 'test_helper'
|
7
|
-
|
8
5
|
|
9
6
|
# -- Tests ----
|
10
|
-
class PrimeTest
|
7
|
+
class PrimeTest< Test::Unit::TestCase
|
11
8
|
def test_consistency
|
12
9
|
result = RubyProf.profile do
|
13
10
|
run_primes
|
14
11
|
end
|
15
|
-
|
16
|
-
result.threads.values.each do |methods|
|
17
|
-
methods.each do |method|
|
18
|
-
check_parent_times(method)
|
19
|
-
check_parent_calls(method)
|
20
|
-
check_child_times(method)
|
21
|
-
end
|
22
|
-
end
|
23
12
|
end
|
24
13
|
end
|
data/test/printers_test.rb
CHANGED
@@ -2,13 +2,11 @@
|
|
2
2
|
require 'test/unit'
|
3
3
|
require 'ruby-prof'
|
4
4
|
require 'prime'
|
5
|
-
require 'test_helper'
|
6
|
-
|
7
5
|
|
8
6
|
# -- Tests ----
|
9
7
|
class PrintersTest < Test::Unit::TestCase
|
10
|
-
|
11
8
|
def setup
|
9
|
+
RubyProf::measure_mode = RubyProf::PROCESS_TIME
|
12
10
|
@result = RubyProf.profile do
|
13
11
|
run_primes
|
14
12
|
end
|
@@ -31,18 +29,18 @@ class PrintersTest < Test::Unit::TestCase
|
|
31
29
|
assert(true)
|
32
30
|
end
|
33
31
|
|
34
|
-
def
|
32
|
+
def test_flat_string
|
35
33
|
output = ''
|
36
34
|
|
37
35
|
printer = RubyProf::FlatPrinter.new(@result)
|
38
|
-
assert_nothing_raised { printer.print(
|
36
|
+
assert_nothing_raised { printer.print(output) }
|
39
37
|
|
40
|
-
assert_match(
|
41
|
-
assert_match(
|
42
|
-
assert_match(
|
38
|
+
assert_match(/Thread ID: -?\d+/i, output)
|
39
|
+
assert_match(/Total: \d+\.\d+/i, output)
|
40
|
+
assert_match(/Object#run_primes/i, output)
|
43
41
|
end
|
44
42
|
|
45
|
-
def
|
43
|
+
def test_graph_html_string
|
46
44
|
output = ''
|
47
45
|
printer = RubyProf::GraphHtmlPrinter.new(@result)
|
48
46
|
assert_nothing_raised { printer.print(output) }
|
@@ -52,17 +50,17 @@ class PrintersTest < Test::Unit::TestCase
|
|
52
50
|
assert_match( /Object#run_primes/i, output )
|
53
51
|
end
|
54
52
|
|
55
|
-
def
|
53
|
+
def test_graph_string
|
56
54
|
output = ''
|
57
55
|
printer = RubyProf::GraphPrinter.new(@result)
|
58
56
|
assert_nothing_raised { printer.print(output) }
|
59
57
|
|
60
|
-
assert_match( /Thread ID:
|
58
|
+
assert_match( /Thread ID: -?\d+/i, output )
|
61
59
|
assert_match( /Total Time: \d+\.\d+/i, output )
|
62
60
|
assert_match( /Object#run_primes/i, output )
|
63
61
|
end
|
64
62
|
|
65
|
-
def
|
63
|
+
def test_call_tree_string
|
66
64
|
output = ''
|
67
65
|
printer = RubyProf::CallTreePrinter.new(@result)
|
68
66
|
assert_nothing_raised { printer.print(output) }
|
@@ -70,5 +68,4 @@ class PrintersTest < Test::Unit::TestCase
|
|
70
68
|
assert_match(/fn=Object::find_primes/i, output)
|
71
69
|
assert_match(/events: process_time/i, output)
|
72
70
|
end
|
73
|
-
|
74
71
|
end
|