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.
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
+
@@ -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: