stackprofx 0.2.7

Sign up to get free protection for your applications and to get access to all the features.
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: