ruby-prof 0.9.1 → 0.9.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 +5 -0
- data/ext/ruby_prof/ruby_prof.c +16 -9
- data/ext/ruby_prof/version.h +2 -2
- data/lib/ruby-prof.rb +3 -3
- data/lib/ruby-prof/dot_printer.rb +4 -2
- data/test/bad.rb +6 -0
- data/test/basic2_test.rb +20 -0
- data/test/module_test.rb +5 -15
- data/test/multi_printer_test.rb +1 -1
- data/test/printers_test.rb +37 -14
- data/test/recursive_test.rb +4 -4
- data/test/start_stop_test.rb +19 -2
- metadata +5 -9
- data/lib/ruby_prof.so +0 -0
data/CHANGES
CHANGED
data/ext/ruby_prof/ruby_prof.c
CHANGED
@@ -1086,10 +1086,10 @@ prof_pop_threads()
|
|
1086
1086
|
}
|
1087
1087
|
|
1088
1088
|
#if RUBY_VERSION == 190
|
1089
|
-
# error 1.9.0 not supported (ask for it if
|
1089
|
+
# error 1.9.0 not supported (ask for it if you desire it to be supported)
|
1090
1090
|
#endif
|
1091
1091
|
|
1092
|
-
#if RUBY_VERSION
|
1092
|
+
#if RUBY_VERSION >= 191
|
1093
1093
|
|
1094
1094
|
/* Avoid bugs in 1.9.1 */
|
1095
1095
|
|
@@ -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
|
1163
|
+
# if RUBY_VERSION >= 191
|
1164
1164
|
/* ensure that new threads are hooked [sigh] (bug in core) */
|
1165
1165
|
prof_remove_hook();
|
1166
1166
|
prof_install_hook();
|
@@ -1194,7 +1194,7 @@ prof_event_hook(rb_event_flag_t event, NODE *node, VALUE self, ID mid, VALUE kla
|
|
1194
1194
|
{
|
1195
1195
|
frame->line = rb_sourceline();
|
1196
1196
|
|
1197
|
-
# if RUBY_VERSION
|
1197
|
+
# if RUBY_VERSION >= 191
|
1198
1198
|
// disabled it causes
|
1199
1199
|
// us to lose valuable frame information...maybe mid comes in wrong sometimes?
|
1200
1200
|
// walk_up_until_right_frame(frame, thread_data, mid, klass, now);
|
@@ -1260,7 +1260,7 @@ prof_event_hook(rb_event_flag_t event, NODE *node, VALUE self, ID mid, VALUE kla
|
|
1260
1260
|
{
|
1261
1261
|
frame = pop_frame(thread_data, now);
|
1262
1262
|
|
1263
|
-
# if RUBY_VERSION
|
1263
|
+
# if RUBY_VERSION >= 191
|
1264
1264
|
// we need to walk up the stack to find the right one [http://redmine.ruby-lang.org/issues/show/2610] (for now)
|
1265
1265
|
// sometimes frames don't have line and source somehow [like blank]
|
1266
1266
|
// if we hit one there's not much we can do...I guess...
|
@@ -1273,7 +1273,7 @@ prof_event_hook(rb_event_flag_t event, NODE *node, VALUE self, ID mid, VALUE kla
|
|
1273
1273
|
}
|
1274
1274
|
}
|
1275
1275
|
|
1276
|
-
#if RUBY_VERSION
|
1276
|
+
#if RUBY_VERSION >= 191
|
1277
1277
|
|
1278
1278
|
static inline void walk_up_until_right_frame(prof_frame_t *frame, thread_data_t* thread_data, ID mid, VALUE klass, prof_measure_t now) {
|
1279
1279
|
// while it doesn't match, pop on up until we have found where we belong...
|
@@ -1613,6 +1613,11 @@ prof_resume(VALUE self)
|
|
1613
1613
|
static VALUE
|
1614
1614
|
prof_stop(VALUE self)
|
1615
1615
|
{
|
1616
|
+
if (threads_tbl == NULL)
|
1617
|
+
{
|
1618
|
+
rb_raise(rb_eRuntimeError, "RubyProf.start was not yet called");
|
1619
|
+
}
|
1620
|
+
|
1616
1621
|
VALUE result = Qnil;
|
1617
1622
|
|
1618
1623
|
/* close trace file if open */
|
@@ -1660,7 +1665,7 @@ prof_profile(VALUE self)
|
|
1660
1665
|
return prof_stop(self);
|
1661
1666
|
}
|
1662
1667
|
|
1663
|
-
/* Get
|
1668
|
+
/* Get around annoying limitations in RDOC */
|
1664
1669
|
|
1665
1670
|
/* Document-method: measure_process_time
|
1666
1671
|
call-seq:
|
@@ -1726,8 +1731,10 @@ Returns the total number of garbage collections.*/
|
|
1726
1731
|
Returns the time spent doing garbage collections in microseconds.*/
|
1727
1732
|
|
1728
1733
|
|
1729
|
-
#if
|
1730
|
-
|
1734
|
+
#if RUBY_VERSION == 191 // accomodate for this: http://redmine.ruby-lang.org/issues/show/3748
|
1735
|
+
# if defined(_WIN32)
|
1736
|
+
__declspec(dllexport)
|
1737
|
+
# endif
|
1731
1738
|
#endif
|
1732
1739
|
void
|
1733
1740
|
|
data/ext/ruby_prof/version.h
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#define RUBY_PROF_VERSION "0.9.
|
1
|
+
#define RUBY_PROF_VERSION "0.9.2" // for easy parsing from rake files
|
2
2
|
#define RUBY_PROF_VERSION_MAJ 0
|
3
3
|
#define RUBY_PROF_VERSION_MIN 9
|
4
|
-
#define RUBY_PROF_VERSION_MIC
|
4
|
+
#define RUBY_PROF_VERSION_MIC 2
|
data/lib/ruby-prof.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
# require the .so file
|
1
|
+
# require the .so file...
|
2
|
+
|
2
3
|
me = File.dirname(__FILE__) + '/'
|
3
4
|
begin
|
4
5
|
# fat binaries
|
@@ -19,9 +20,8 @@ require "ruby-prof/call_tree_printer"
|
|
19
20
|
require "ruby-prof/call_stack_printer"
|
20
21
|
require "ruby-prof/multi_printer"
|
21
22
|
require "ruby-prof/dot_printer"
|
22
|
-
require "ruby-prof/symbol_to_proc" # for 1.8's benefit
|
23
|
+
require "ruby-prof/symbol_to_proc" # for 1.8's backward compatibility benefit
|
23
24
|
require "ruby-prof/rack"
|
24
|
-
#require "ruby-prof/result"
|
25
25
|
|
26
26
|
module RubyProf
|
27
27
|
# See if the user specified the clock mode via
|
@@ -113,9 +113,11 @@ module RubyProf
|
|
113
113
|
end
|
114
114
|
|
115
115
|
def print_classes(thread_id, methods)
|
116
|
-
|
116
|
+
grouped = {}
|
117
|
+
methods.each{|m| grouped[m.klass_name] ||= []; grouped[m.klass_name] << m}
|
118
|
+
grouped.each do |cls, methods2|
|
117
119
|
# Filter down to just seen methods
|
118
|
-
big_methods, small_methods =
|
120
|
+
big_methods, small_methods = methods2.partition{|m| @seen_methods.include? m}
|
119
121
|
|
120
122
|
if !big_methods.empty?
|
121
123
|
puts "subgraph cluster_#{cls.object_id} {"
|
data/test/bad.rb
ADDED
data/test/basic2_test.rb
ADDED
@@ -0,0 +1,20 @@
|
|
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
|
data/test/module_test.rb
CHANGED
@@ -31,24 +31,14 @@ class ModuleTest < Test::Unit::TestCase
|
|
31
31
|
hello
|
32
32
|
end
|
33
33
|
|
34
|
-
methods = result.threads.values.first
|
34
|
+
methods = result.threads.values.first
|
35
35
|
|
36
36
|
# Length should be 5
|
37
37
|
assert_equal(5, methods.length)
|
38
38
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
assert_equal('Bar#hello', method.full_name)
|
44
|
-
|
45
|
-
method = methods[2]
|
46
|
-
assert_equal('Kernel#sleep', method.full_name)
|
47
|
-
|
48
|
-
method = methods[3]
|
49
|
-
assert_equal('<Module::Bar>#hello', method.full_name)
|
50
|
-
|
51
|
-
method = methods[4]
|
52
|
-
assert_equal('<Module::Foo>#hello', method.full_name)
|
39
|
+
# these methods should be in there... (hard to tell order though).
|
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
|
42
|
+
end
|
53
43
|
end
|
54
44
|
end
|
data/test/multi_printer_test.rb
CHANGED
@@ -58,7 +58,7 @@ class MultiPrinterTest < Test::Unit::TestCase
|
|
58
58
|
assert graph =~ re
|
59
59
|
display_time = $1.to_f
|
60
60
|
difference = (expected_time-display_time).abs
|
61
|
-
assert_in_delta expected_time, display_time, 0.
|
61
|
+
assert_in_delta expected_time, display_time, 0.005
|
62
62
|
end
|
63
63
|
|
64
64
|
private
|
data/test/printers_test.rb
CHANGED
@@ -2,19 +2,26 @@
|
|
2
2
|
require 'test/unit'
|
3
3
|
require 'ruby-prof'
|
4
4
|
require 'prime'
|
5
|
+
require 'stringio'
|
6
|
+
require 'fileutils'
|
7
|
+
require 'rubygems'
|
5
8
|
|
6
9
|
# -- Tests ----
|
7
10
|
class PrintersTest < Test::Unit::TestCase
|
8
11
|
|
9
12
|
def go
|
10
|
-
run_primes(
|
13
|
+
run_primes(1000)
|
11
14
|
end
|
12
15
|
|
13
16
|
def setup
|
14
|
-
RubyProf::measure_mode = RubyProf::WALL_TIME # WALL_TIME so we can use sleep in our test
|
17
|
+
RubyProf::measure_mode = RubyProf::WALL_TIME # WALL_TIME so we can use sleep in our test and get same measurements on linux and doze
|
15
18
|
@result = RubyProf.profile do
|
16
|
-
|
17
|
-
|
19
|
+
begin
|
20
|
+
run_primes(1000)
|
21
|
+
go
|
22
|
+
rescue => e
|
23
|
+
p e
|
24
|
+
end
|
18
25
|
end
|
19
26
|
|
20
27
|
end
|
@@ -37,15 +44,25 @@ class PrintersTest < Test::Unit::TestCase
|
|
37
44
|
|
38
45
|
printer = RubyProf::CallTreePrinter.new(@result)
|
39
46
|
printer.print(output)
|
47
|
+
output_dir = 'examples2'
|
48
|
+
|
49
|
+
if ENV['SAVE_NEW_PRINTER_EXAMPLES']
|
50
|
+
output_dir = 'examples'
|
51
|
+
end
|
52
|
+
FileUtils.mkdir_p output_dir
|
40
53
|
|
41
54
|
printer = RubyProf::DotPrinter.new(@result)
|
42
|
-
File.open("
|
55
|
+
File.open("#{output_dir}/graph.dot", "w") {|f| printer.print(f)}
|
43
56
|
|
44
57
|
printer = RubyProf::CallStackPrinter.new(@result)
|
45
|
-
File.open("
|
58
|
+
File.open("#{output_dir}/stack.html", "w") {|f| printer.print(f, :application => "primes")}
|
46
59
|
|
47
60
|
printer = RubyProf::MultiPrinter.new(@result)
|
48
|
-
printer.print(:path => "
|
61
|
+
printer.print(:path => "#{output_dir}", :profile => "multi", :application => "primes")
|
62
|
+
for file in ['empty.png', 'graph.dot', 'minus.png', 'multi.flat.txt', 'multi.graph.html', 'multi.grind.dat', 'multi.stack.html', 'plus.png', 'stack.html']
|
63
|
+
existant_file = output_dir + '/' + file
|
64
|
+
assert File.size(existant_file) > 0
|
65
|
+
end
|
49
66
|
end
|
50
67
|
end
|
51
68
|
|
@@ -73,13 +90,19 @@ class PrintersTest < Test::Unit::TestCase
|
|
73
90
|
assert_match(/called from/, output)
|
74
91
|
|
75
92
|
# should combine common parents
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
93
|
+
# lodo remove...
|
94
|
+
#if RUBY_VERSION < '1.9'
|
95
|
+
#require 'ruby-debug'
|
96
|
+
#debugger
|
97
|
+
#print output
|
98
|
+
assert_equal(3, output.scan(/Object#is_prime/).length) # failing this is prolly a 1.9.2 core bug
|
99
|
+
#else
|
100
|
+
# # 1.9
|
101
|
+
# require 'ruby-debug'
|
102
|
+
# debugger
|
103
|
+
# assert_equal(2, output.scan(/Object#is_prime/).length)
|
104
|
+
#end
|
105
|
+
assert_no_match(/\.\/test\/prime.rb/, output) # don't use relative paths
|
83
106
|
end
|
84
107
|
|
85
108
|
def test_graph_html_string
|
data/test/recursive_test.rb
CHANGED
@@ -74,10 +74,10 @@ class RecursiveTest < Test::Unit::TestCase
|
|
74
74
|
method = methods[2]
|
75
75
|
assert_equal('Kernel#sleep', method.full_name)
|
76
76
|
assert_equal(2, method.called)
|
77
|
-
assert_in_delta(2, method.total_time, 0.
|
78
|
-
assert_in_delta(2, method.self_time, 0.
|
79
|
-
assert_in_delta(0, method.wait_time, 0.
|
80
|
-
assert_in_delta(0, method.children_time, 0.
|
77
|
+
assert_in_delta(2, method.total_time, 0.05)
|
78
|
+
assert_in_delta(2, method.self_time, 0.05)
|
79
|
+
assert_in_delta(0, method.wait_time, 0.05)
|
80
|
+
assert_in_delta(0, method.children_time, 0.05)
|
81
81
|
|
82
82
|
assert_equal(2, method.call_infos.length)
|
83
83
|
call_info = method.call_infos[0]
|
data/test/start_stop_test.rb
CHANGED
@@ -22,6 +22,23 @@ class StartStopTest < Test::Unit::TestCase
|
|
22
22
|
sleep(2)
|
23
23
|
@result = RubyProf.stop
|
24
24
|
end
|
25
|
+
|
26
|
+
def test_extra_stop_should_raise
|
27
|
+
RubyProf.start
|
28
|
+
assert_raise(RuntimeError) do
|
29
|
+
RubyProf.start
|
30
|
+
end
|
31
|
+
|
32
|
+
assert_raise(RuntimeError) do
|
33
|
+
RubyProf.profile {}
|
34
|
+
end
|
35
|
+
|
36
|
+
RubyProf.stop # ok
|
37
|
+
assert_raise(RuntimeError) do
|
38
|
+
RubyProf.stop
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
25
42
|
|
26
43
|
def test_different_methods
|
27
44
|
method1
|
@@ -56,10 +73,10 @@ class StartStopTest < Test::Unit::TestCase
|
|
56
73
|
method = methods[1]
|
57
74
|
assert_equal('StartStopTest#method2', method.full_name)
|
58
75
|
assert_equal(1, method.called)
|
59
|
-
assert_in_delta(2, method.total_time, 0.
|
76
|
+
assert_in_delta(2, method.total_time, 0.05)
|
60
77
|
assert_in_delta(0, method.wait_time, 0.01)
|
61
78
|
assert_in_delta(0, method.self_time, 0.01)
|
62
|
-
assert_in_delta(2, method.children_time, 0.
|
79
|
+
assert_in_delta(2, method.children_time, 0.05)
|
63
80
|
assert_equal(1, method.call_infos.length)
|
64
81
|
|
65
82
|
call_info = method.call_infos[0]
|
metadata
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-prof
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 57
|
5
4
|
prerelease: false
|
6
5
|
segments:
|
7
6
|
- 0
|
8
7
|
- 9
|
9
|
-
-
|
10
|
-
version: 0.9.
|
8
|
+
- 2
|
9
|
+
version: 0.9.2
|
11
10
|
platform: ruby
|
12
11
|
authors:
|
13
12
|
- Shugo Maeda, Charlie Savage, Roger Pack, Stefan Kaes
|
@@ -15,7 +14,7 @@ autorequire:
|
|
15
14
|
bindir: bin
|
16
15
|
cert_chain: []
|
17
16
|
|
18
|
-
date: 2010-08-
|
17
|
+
date: 2010-08-26 00:00:00 -06:00
|
19
18
|
default_executable:
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
@@ -26,7 +25,6 @@ dependencies:
|
|
26
25
|
requirements:
|
27
26
|
- - ">="
|
28
27
|
- !ruby/object:Gem::Version
|
29
|
-
hash: 3
|
30
28
|
segments:
|
31
29
|
- 0
|
32
30
|
version: "0"
|
@@ -40,7 +38,6 @@ dependencies:
|
|
40
38
|
requirements:
|
41
39
|
- - ">="
|
42
40
|
- !ruby/object:Gem::Version
|
43
|
-
hash: 3
|
44
41
|
segments:
|
45
42
|
- 0
|
46
43
|
version: "0"
|
@@ -113,12 +110,13 @@ files:
|
|
113
110
|
- lib/ruby-prof/task.rb
|
114
111
|
- lib/ruby-prof/test.rb
|
115
112
|
- lib/ruby-prof.rb
|
116
|
-
- lib/ruby_prof.so
|
117
113
|
- lib/unprof.rb
|
118
114
|
- rails/environment/profile.rb
|
119
115
|
- rails/example/example_test.rb
|
120
116
|
- rails/profile_test_helper.rb
|
121
117
|
- test/aggregate_test.rb
|
118
|
+
- test/bad.rb
|
119
|
+
- test/basic2_test.rb
|
122
120
|
- test/basic_test.rb
|
123
121
|
- test/current_failures_windows
|
124
122
|
- test/do_nothing.rb
|
@@ -160,7 +158,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
160
158
|
requirements:
|
161
159
|
- - ">="
|
162
160
|
- !ruby/object:Gem::Version
|
163
|
-
hash: 63
|
164
161
|
segments:
|
165
162
|
- 1
|
166
163
|
- 8
|
@@ -171,7 +168,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
171
168
|
requirements:
|
172
169
|
- - ">="
|
173
170
|
- !ruby/object:Gem::Version
|
174
|
-
hash: 3
|
175
171
|
segments:
|
176
172
|
- 0
|
177
173
|
version: "0"
|
data/lib/ruby_prof.so
DELETED
Binary file
|