ruby-prof 0.9.1 → 0.9.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|