stackprofx 0.2.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +4 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +24 -0
- data/README.md +41 -0
- data/Rakefile +31 -0
- data/ext/extconf.rb +11 -0
- data/ext/ruby_headers/215/id.h +171 -0
- data/ext/ruby_headers/215/internal.h +889 -0
- data/ext/ruby_headers/215/iseq.h +136 -0
- data/ext/ruby_headers/215/method.h +142 -0
- data/ext/ruby_headers/215/node.h +543 -0
- data/ext/ruby_headers/215/ruby_atomic.h +170 -0
- data/ext/ruby_headers/215/thread_native.h +23 -0
- data/ext/ruby_headers/215/thread_pthread.h +56 -0
- data/ext/ruby_headers/215/thread_win32.h +45 -0
- data/ext/ruby_headers/215/vm_core.h +1042 -0
- data/ext/ruby_headers/215/vm_debug.h +37 -0
- data/ext/ruby_headers/215/vm_opts.h +56 -0
- data/ext/stackprofx.c +622 -0
- data/sample.rb +34 -0
- data/stackprofx.gemspec +20 -0
- data/test/test_stackprofx.rb +158 -0
- metadata +113 -0
data/sample.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
$:.unshift File.expand_path('../lib', __FILE__)
|
2
|
+
require 'stackprofx'
|
3
|
+
|
4
|
+
class A
|
5
|
+
def initialize
|
6
|
+
pow
|
7
|
+
self.class.newobj
|
8
|
+
math
|
9
|
+
end
|
10
|
+
|
11
|
+
def pow
|
12
|
+
2 ** 100
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.newobj
|
16
|
+
Object.new
|
17
|
+
Object.new
|
18
|
+
end
|
19
|
+
|
20
|
+
def math
|
21
|
+
2.times do
|
22
|
+
2 + 3 * 4 ^ 5 / 6
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
#profile = StackProfx.run(:object, 1) do
|
28
|
+
#profile = StackProfx.run(:wall, 1000) do
|
29
|
+
profile = StackProfx.run(:cpu, 1000) do
|
30
|
+
1_000_000.times do
|
31
|
+
A.new
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
data/stackprofx.gemspec
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'stackprofx'
|
3
|
+
s.version = '0.2.7'
|
4
|
+
s.homepage = 'http://github.com/tmm1/stackprofx'
|
5
|
+
|
6
|
+
s.authors = ['Aman Gupta', 'Aidan Steele']
|
7
|
+
s.email = ['aman@tmm1.net', 'aidan.steele@glassechidna.com.au']
|
8
|
+
|
9
|
+
s.files = `git ls-files`.split("\n")
|
10
|
+
s.extensions = 'ext/extconf.rb'
|
11
|
+
|
12
|
+
s.summary = 'fork of sampling callstack-profiler for ruby 2.1+'
|
13
|
+
s.description = 'stackprofx is a hacky derivative of stackprof, the sampling profiler for Ruby 2.+1.'
|
14
|
+
|
15
|
+
s.license = 'MIT'
|
16
|
+
|
17
|
+
s.add_development_dependency 'rake-compiler', '~> 0.9'
|
18
|
+
s.add_development_dependency 'mocha', '~> 0.14'
|
19
|
+
s.add_development_dependency 'minitest', '~> 5.0'
|
20
|
+
end
|
@@ -0,0 +1,158 @@
|
|
1
|
+
$:.unshift File.expand_path('../../lib', __FILE__)
|
2
|
+
require 'stackprofx'
|
3
|
+
require 'minitest/autorun'
|
4
|
+
require 'tempfile'
|
5
|
+
|
6
|
+
class StackProfxTest < MiniTest::Test
|
7
|
+
def test_info
|
8
|
+
profile = StackProfx.run{}
|
9
|
+
assert_equal 1.1, profile[:version]
|
10
|
+
assert_equal :wall, profile[:mode]
|
11
|
+
assert_equal 1000, profile[:interval]
|
12
|
+
assert_equal 0, profile[:samples]
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_running
|
16
|
+
assert_equal false, StackProfx.running?
|
17
|
+
StackProfx.run{ assert_equal true, StackProfx.running? }
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_start_stop_results
|
21
|
+
assert_equal nil, StackProfx.results
|
22
|
+
assert_equal true, StackProfx.start
|
23
|
+
assert_equal false, StackProfx.start
|
24
|
+
assert_equal true, StackProfx.running?
|
25
|
+
assert_equal nil, StackProfx.results
|
26
|
+
assert_equal true, StackProfx.stop
|
27
|
+
assert_equal false, StackProfx.stop
|
28
|
+
assert_equal false, StackProfx.running?
|
29
|
+
assert_kind_of Hash, StackProfx.results
|
30
|
+
assert_equal nil, StackProfx.results
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_object_allocation
|
34
|
+
profile = StackProfx.run(mode: :object) do
|
35
|
+
Object.new
|
36
|
+
Object.new
|
37
|
+
end
|
38
|
+
assert_equal :object, profile[:mode]
|
39
|
+
assert_equal 1, profile[:interval]
|
40
|
+
assert_equal 2, profile[:samples]
|
41
|
+
|
42
|
+
frame = profile[:frames].values.first
|
43
|
+
assert_equal "block in StackProfxTest#test_object_allocation", frame[:name]
|
44
|
+
assert_equal 2, frame[:samples]
|
45
|
+
line = __LINE__
|
46
|
+
assert_equal line-11, frame[:line]
|
47
|
+
assert_equal [1, 1], frame[:lines][line-10]
|
48
|
+
assert_equal [1, 1], frame[:lines][line-9]
|
49
|
+
|
50
|
+
frame = profile[:frames].values[1]
|
51
|
+
assert_equal [2, 0], frame[:lines][line-11]
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_object_allocation_interval
|
55
|
+
profile = StackProfx.run(mode: :object, interval: 10) do
|
56
|
+
100.times { Object.new }
|
57
|
+
end
|
58
|
+
assert_equal 10, profile[:samples]
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_cputime
|
62
|
+
profile = StackProfx.run(mode: :cpu, interval: 500) do
|
63
|
+
math
|
64
|
+
end
|
65
|
+
|
66
|
+
assert_operator profile[:samples], :>, 1
|
67
|
+
frame = profile[:frames].values.first
|
68
|
+
assert_equal "block in StackProfxTest#math", frame[:name]
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_walltime
|
72
|
+
profile = StackProfx.run(mode: :wall) do
|
73
|
+
idle
|
74
|
+
end
|
75
|
+
|
76
|
+
frame = profile[:frames].values.first
|
77
|
+
assert_equal "StackProfxTest#idle", frame[:name]
|
78
|
+
assert_in_delta 200, frame[:samples], 5
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_custom
|
82
|
+
profile = StackProfx.run(mode: :custom) do
|
83
|
+
10.times do
|
84
|
+
StackProfx.sample
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
assert_equal :custom, profile[:mode]
|
89
|
+
assert_equal 10, profile[:samples]
|
90
|
+
|
91
|
+
frame = profile[:frames].values.first
|
92
|
+
assert_equal "block (2 levels) in StackProfxTest#test_custom", frame[:name]
|
93
|
+
assert_equal __LINE__-10, frame[:line]
|
94
|
+
assert_equal [10, 10], frame[:lines][__LINE__-10]
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_raw
|
98
|
+
profile = StackProfx.run(mode: :custom, raw: true) do
|
99
|
+
10.times do
|
100
|
+
StackProfx.sample
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
raw = profile[:raw]
|
105
|
+
assert_equal 10, raw[-1]
|
106
|
+
assert_equal raw[0] + 2, raw.size
|
107
|
+
assert_equal 'block (2 levels) in StackProfxTest#test_raw', profile[:frames][raw[-2]][:name]
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_fork
|
111
|
+
StackProfx.run do
|
112
|
+
pid = fork do
|
113
|
+
exit! StackProfx.running?? 1 : 0
|
114
|
+
end
|
115
|
+
Process.wait(pid)
|
116
|
+
assert_equal 0, $?.exitstatus
|
117
|
+
assert_equal true, StackProfx.running?
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def test_gc
|
122
|
+
profile = StackProfx.run(interval: 100) do
|
123
|
+
5.times do
|
124
|
+
GC.start
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
assert_empty profile[:frames]
|
129
|
+
assert_operator profile[:gc_samples], :>, 0
|
130
|
+
assert_equal 0, profile[:missed_samples]
|
131
|
+
end
|
132
|
+
|
133
|
+
def test_out
|
134
|
+
tmpfile = Tempfile.new('stackprof-out')
|
135
|
+
ret = StackProfx.run(mode: :custom, out: tmpfile) do
|
136
|
+
StackProfx.sample
|
137
|
+
end
|
138
|
+
|
139
|
+
assert_equal tmpfile, ret
|
140
|
+
tmpfile.rewind
|
141
|
+
profile = Marshal.load(tmpfile.read)
|
142
|
+
refute_empty profile[:frames]
|
143
|
+
end
|
144
|
+
|
145
|
+
def math
|
146
|
+
250_000.times do
|
147
|
+
2 ** 10
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
def idle
|
152
|
+
r, w = IO.pipe
|
153
|
+
IO.select([r], nil, nil, 0.2)
|
154
|
+
ensure
|
155
|
+
r.close
|
156
|
+
w.close
|
157
|
+
end
|
158
|
+
end
|
metadata
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: stackprofx
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.7
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Aman Gupta
|
8
|
+
- Aidan Steele
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2015-01-23 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake-compiler
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '0.9'
|
21
|
+
type: :development
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - "~>"
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '0.9'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: mocha
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - "~>"
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0.14'
|
35
|
+
type: :development
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - "~>"
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0.14'
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: minitest
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - "~>"
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '5.0'
|
49
|
+
type: :development
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - "~>"
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '5.0'
|
56
|
+
description: stackprofx is a hacky derivative of stackprof, the sampling profiler
|
57
|
+
for Ruby 2.+1.
|
58
|
+
email:
|
59
|
+
- aman@tmm1.net
|
60
|
+
- aidan.steele@glassechidna.com.au
|
61
|
+
executables: []
|
62
|
+
extensions:
|
63
|
+
- ext/extconf.rb
|
64
|
+
extra_rdoc_files: []
|
65
|
+
files:
|
66
|
+
- ".gitignore"
|
67
|
+
- Gemfile
|
68
|
+
- Gemfile.lock
|
69
|
+
- README.md
|
70
|
+
- Rakefile
|
71
|
+
- ext/extconf.rb
|
72
|
+
- ext/ruby_headers/215/id.h
|
73
|
+
- ext/ruby_headers/215/internal.h
|
74
|
+
- ext/ruby_headers/215/iseq.h
|
75
|
+
- ext/ruby_headers/215/method.h
|
76
|
+
- ext/ruby_headers/215/node.h
|
77
|
+
- ext/ruby_headers/215/ruby_atomic.h
|
78
|
+
- ext/ruby_headers/215/thread_native.h
|
79
|
+
- ext/ruby_headers/215/thread_pthread.h
|
80
|
+
- ext/ruby_headers/215/thread_win32.h
|
81
|
+
- ext/ruby_headers/215/vm_core.h
|
82
|
+
- ext/ruby_headers/215/vm_debug.h
|
83
|
+
- ext/ruby_headers/215/vm_opts.h
|
84
|
+
- ext/stackprofx.c
|
85
|
+
- sample.rb
|
86
|
+
- stackprofx.gemspec
|
87
|
+
- test/test_stackprofx.rb
|
88
|
+
homepage: http://github.com/tmm1/stackprofx
|
89
|
+
licenses:
|
90
|
+
- MIT
|
91
|
+
metadata: {}
|
92
|
+
post_install_message:
|
93
|
+
rdoc_options: []
|
94
|
+
require_paths:
|
95
|
+
- lib
|
96
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
97
|
+
requirements:
|
98
|
+
- - ">="
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: '0'
|
101
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
102
|
+
requirements:
|
103
|
+
- - ">="
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: '0'
|
106
|
+
requirements: []
|
107
|
+
rubyforge_project:
|
108
|
+
rubygems_version: 2.2.2
|
109
|
+
signing_key:
|
110
|
+
specification_version: 4
|
111
|
+
summary: fork of sampling callstack-profiler for ruby 2.1+
|
112
|
+
test_files: []
|
113
|
+
has_rdoc:
|