stackprofx 0.2.7
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.
- 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:
|