rubyperf 0.0.0
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/.document +5 -0
- data/.idea/encodings.xml +5 -0
- data/.idea/misc.xml +11 -0
- data/.idea/modules.xml +9 -0
- data/.idea/rubyperf.iml +15 -0
- data/.idea/vcs.xml +7 -0
- data/Gemfile +13 -0
- data/Gemfile.lock +20 -0
- data/LICENSE.txt +31 -0
- data/README.rdoc +35 -0
- data/Rakefile +53 -0
- data/VERSION +1 -0
- data/lib/perf/meter.rb +374 -0
- data/lib/perf/meter_factory.rb +47 -0
- data/lib/perf/no_op_meter.rb +39 -0
- data/lib/perf/noop_measure.rb +39 -0
- data/lib/perf/report_format.rb +130 -0
- data/lib/perf/report_format_html.rb +34 -0
- data/lib/perf/report_format_simple.rb +67 -0
- data/lib/rubyperf.rb +154 -0
- data/test/helper.rb +24 -0
- data/test/perf_test_example.rb +19 -0
- data/test/rubyperf_test_helpers.rb +43 -0
- data/test/test_perf_meter.rb +230 -0
- metadata +150 -0
@@ -0,0 +1,230 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2012 Lorenzo Pasqualis - DreamBox Learning, Inc
|
3
|
+
# https://github.com/lpasqualis/rubyperf
|
4
|
+
#
|
5
|
+
|
6
|
+
require "test/unit"
|
7
|
+
|
8
|
+
require 'helper'
|
9
|
+
|
10
|
+
require 'rubyperf'
|
11
|
+
|
12
|
+
require 'rubyperf_test_helpers'
|
13
|
+
require 'perf_test_example'
|
14
|
+
|
15
|
+
class TestPerfMeter < Test::Unit::TestCase
|
16
|
+
|
17
|
+
# Called before every test method runs. Can be used
|
18
|
+
# to set up fixture information.
|
19
|
+
def setup
|
20
|
+
# Do nothing
|
21
|
+
end
|
22
|
+
|
23
|
+
# Called after every test method runs. Can be used to tear
|
24
|
+
# down fixture information.
|
25
|
+
|
26
|
+
def teardown
|
27
|
+
# Do nothing
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_method_not_corrupted_after_restoring
|
31
|
+
m=Perf::Meter.new
|
32
|
+
imethods=PerfTestExample.new.methods.sort
|
33
|
+
cmethods=PerfTestExample.methods.sort
|
34
|
+
m.method_meters(PerfTestExample,[:test,:test_np],[:static_method]) do
|
35
|
+
a=PerfTestExample.new
|
36
|
+
a.test(1,2,3)
|
37
|
+
a.test_np
|
38
|
+
PerfTestExample.static_method
|
39
|
+
end
|
40
|
+
assert PerfTestExample.methods.sort == cmethods
|
41
|
+
assert PerfTestExample.new.methods.sort == imethods
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_method_metering
|
45
|
+
m=Perf::Meter.new
|
46
|
+
m.method_meters(PerfTestExample,[:test,:test_np],[:static_method]) do
|
47
|
+
a=PerfTestExample.new
|
48
|
+
a.test(1,2,3)
|
49
|
+
a.test_np
|
50
|
+
PerfTestExample.static_method
|
51
|
+
end
|
52
|
+
m.report_simple
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_base_report
|
56
|
+
m=Perf::Meter.new
|
57
|
+
m.measure(:a) { }
|
58
|
+
m.measure(:b) { }
|
59
|
+
m.measure(:d) { m.measure(:c) { m.measure(:d) {} }}
|
60
|
+
assert_not_nil m.measurements["#{Perf::Meter::PATH_MEASURES}\\d\\c\\d"]
|
61
|
+
assert_not_nil m.measurements["#{Perf::Meter::PATH_MEASURES}\\d\\c"]
|
62
|
+
assert_not_nil m.measurements["#{Perf::Meter::PATH_MEASURES}\\d"]
|
63
|
+
assert_not_nil m.measurements["#{Perf::Meter::PATH_MEASURES}\\b"]
|
64
|
+
assert_not_nil m.measurements["#{Perf::Meter::PATH_MEASURES}\\a"]
|
65
|
+
assert_not_nil m.measurements["#{Perf::Meter::PATH_MEASURES}"]
|
66
|
+
assert_nil m.measurements["#{Perf::Meter::PATH_MEASURES}\\huh"]
|
67
|
+
assert RubyperfTestHelpers.verify_report(m,["#{Perf::Meter::PATH_MEASURES}\\d\\c\\d",
|
68
|
+
"#{Perf::Meter::PATH_MEASURES}\\d\\c",
|
69
|
+
"#{Perf::Meter::PATH_MEASURES}\\d",
|
70
|
+
"#{Perf::Meter::PATH_MEASURES}\\b",
|
71
|
+
"#{Perf::Meter::PATH_MEASURES}"])
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_output_html
|
75
|
+
m=RubyperfTestHelpers.get_measure
|
76
|
+
m.report_html
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_exception_handling
|
80
|
+
# An exeption thwon in a block that we are measuring needs to leave the Perf::Meter in a good state.
|
81
|
+
# This test checks the state after an exception.
|
82
|
+
exception_raised = false
|
83
|
+
measuring_correct = false
|
84
|
+
stack_correct = false
|
85
|
+
m=Perf::Meter.new
|
86
|
+
|
87
|
+
begin
|
88
|
+
m.measure(:some_exception) do
|
89
|
+
a=12/0 # Divide by zero
|
90
|
+
end
|
91
|
+
rescue
|
92
|
+
exception_raised=true
|
93
|
+
ensure
|
94
|
+
measuring_correct=true
|
95
|
+
m.measurements.each_pair do |_,x|
|
96
|
+
measuring_correct=false if x[:measuring]
|
97
|
+
end
|
98
|
+
stack_correct = (m.current_stack.size==0)
|
99
|
+
end
|
100
|
+
assert exception_raised
|
101
|
+
assert measuring_correct
|
102
|
+
assert stack_correct
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_return_values
|
106
|
+
m=Perf::Meter.new
|
107
|
+
|
108
|
+
assert_equal 4,m.measure(:four) {4}
|
109
|
+
assert_equal "hello",m.measure(:hello) {"hel"+"lo"}
|
110
|
+
|
111
|
+
assert_equal 5,m.measure_result(:five) {5}
|
112
|
+
assert_equal "byebye",m.measure_result(:byebye) {"bye"+"bye"}
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_nesting_measure
|
116
|
+
m=Perf::Meter.new
|
117
|
+
m.measure(:a) { }
|
118
|
+
m.measure(:b) { }
|
119
|
+
m.measure(:d) { m.measure(:c) { m.measure(:d) {} }}
|
120
|
+
assert_not_nil m.measurements["#{Perf::Meter::PATH_MEASURES}\\d\\c\\d"]
|
121
|
+
assert_not_nil m.measurements["#{Perf::Meter::PATH_MEASURES}\\d\\c"]
|
122
|
+
assert_not_nil m.measurements["#{Perf::Meter::PATH_MEASURES}\\d"]
|
123
|
+
assert_not_nil m.measurements["#{Perf::Meter::PATH_MEASURES}\\b"]
|
124
|
+
assert_not_nil m.measurements["#{Perf::Meter::PATH_MEASURES}\\a"]
|
125
|
+
assert_not_nil m.measurements["#{Perf::Meter::PATH_MEASURES}"]
|
126
|
+
assert_nil m.measurements["#{Perf::Meter::PATH_MEASURES}\\huh"]
|
127
|
+
end
|
128
|
+
|
129
|
+
def test_measure_instance_method
|
130
|
+
# First test it with measure
|
131
|
+
m=Perf::Meter.new
|
132
|
+
|
133
|
+
a=PerfTestExample.new
|
134
|
+
m.measure(:measure_test) { a.test(1,2,3) }
|
135
|
+
m.measure(:measure_test_np) { a.test_np }
|
136
|
+
m.measure(:some_expressions) do
|
137
|
+
m.measure_result(:expression1) { 1234+12345 }
|
138
|
+
m.measure_result(:expression1) { 1234-123 }
|
139
|
+
m.measure_result(:expression2) { "string" }
|
140
|
+
end
|
141
|
+
# Then use the instance method
|
142
|
+
m.measure_instance_method(PerfTestExample,:test)
|
143
|
+
m.measure_instance_method(PerfTestExample,:test_np)
|
144
|
+
m.measure_instance_method(PerfTestExample,:test) # Do it twice and see what happens
|
145
|
+
m.measure_class_method(PerfTestExample,:static_method)
|
146
|
+
|
147
|
+
a=PerfTestExample.new
|
148
|
+
a.test(1,2,3)
|
149
|
+
a.test_np
|
150
|
+
PerfTestExample.static_method
|
151
|
+
|
152
|
+
# Output the results
|
153
|
+
#puts m.report_simple(m)
|
154
|
+
|
155
|
+
#puts "\nRestoring test:\n\n"
|
156
|
+
|
157
|
+
m.restore_instance_method(PerfTestExample,:test)
|
158
|
+
a=PerfTestExample.new
|
159
|
+
a.test(1,2,3)
|
160
|
+
a.test_np
|
161
|
+
#puts m.report_simple
|
162
|
+
|
163
|
+
m.restore_all_instance_methods(PerfTestExample)
|
164
|
+
a=PerfTestExample.new
|
165
|
+
a.test(1,2,3)
|
166
|
+
a.test_np
|
167
|
+
#puts puts m.report_simple
|
168
|
+
m.restore_all_methods(PerfTestExample)
|
169
|
+
end
|
170
|
+
|
171
|
+
def test_basic
|
172
|
+
m=Perf::Meter.new
|
173
|
+
m.measure(:string_operations) do
|
174
|
+
m.measure(:ciao) do
|
175
|
+
1000.times do; "CIAO"*100; end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
m.measure(:string_operations) do
|
179
|
+
m.measure(:help) do
|
180
|
+
1000.times do; "HELP"*100; end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
m.measure(:emtpy_loop) do
|
184
|
+
50000.times do; end;
|
185
|
+
end
|
186
|
+
m.measure(:rough_overhead_x10000) do
|
187
|
+
1000.times do
|
188
|
+
m.measure(:block_1) do
|
189
|
+
m.measure(:block_1_1) do
|
190
|
+
end
|
191
|
+
m.measure(:block_1_2) do
|
192
|
+
m.measure(:block_1_2_1) do
|
193
|
+
end
|
194
|
+
m.measure(:block_1_2_2) do
|
195
|
+
end
|
196
|
+
m.measure(:block_1_2_3) do
|
197
|
+
m.measure_result(:bool_exp_1_2_3) { false }
|
198
|
+
m.measure_result(:bool_exp_1_2_3) { true }
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
m.measure(:sleep1) do
|
206
|
+
m.measure(:sleep1_1) do
|
207
|
+
sleep(0.01)
|
208
|
+
end
|
209
|
+
m.measure(:sleep_1_2) do
|
210
|
+
sleep(0.02)
|
211
|
+
end
|
212
|
+
m.measure(:sleep_1_3) do
|
213
|
+
sleep(0.03)
|
214
|
+
end
|
215
|
+
end
|
216
|
+
m.measure(:empty) do
|
217
|
+
end
|
218
|
+
m.measure_result("test") { sleep(1) }
|
219
|
+
m.measure_result("test") { false }
|
220
|
+
m.measure_result("test") { false }
|
221
|
+
|
222
|
+
m.method_meters(Array,[:sort,:reverse],[:new]) do
|
223
|
+
Array.new(1000000,"abc").reverse.sort
|
224
|
+
end
|
225
|
+
|
226
|
+
puts m.report_simple
|
227
|
+
puts m.report_html
|
228
|
+
|
229
|
+
end
|
230
|
+
end
|
metadata
ADDED
@@ -0,0 +1,150 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rubyperf
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 31
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 0
|
10
|
+
version: 0.0.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- lpasqualis
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2012-01-13 00:00:00 -08:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
prerelease: false
|
23
|
+
name: shoulda
|
24
|
+
type: :development
|
25
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ">="
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
hash: 3
|
31
|
+
segments:
|
32
|
+
- 0
|
33
|
+
version: "0"
|
34
|
+
requirement: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
prerelease: false
|
37
|
+
name: bundler
|
38
|
+
type: :development
|
39
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ~>
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
hash: 23
|
45
|
+
segments:
|
46
|
+
- 1
|
47
|
+
- 0
|
48
|
+
- 0
|
49
|
+
version: 1.0.0
|
50
|
+
requirement: *id002
|
51
|
+
- !ruby/object:Gem::Dependency
|
52
|
+
prerelease: false
|
53
|
+
name: jeweler
|
54
|
+
type: :development
|
55
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
56
|
+
none: false
|
57
|
+
requirements:
|
58
|
+
- - ~>
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
hash: 7
|
61
|
+
segments:
|
62
|
+
- 1
|
63
|
+
- 6
|
64
|
+
- 4
|
65
|
+
version: 1.6.4
|
66
|
+
requirement: *id003
|
67
|
+
- !ruby/object:Gem::Dependency
|
68
|
+
prerelease: false
|
69
|
+
name: rcov
|
70
|
+
type: :development
|
71
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
hash: 3
|
77
|
+
segments:
|
78
|
+
- 0
|
79
|
+
version: "0"
|
80
|
+
requirement: *id004
|
81
|
+
description: Measures the performance of blocks of code, and provide reporting in various formats
|
82
|
+
email: lpasqualis@gmail.com
|
83
|
+
executables: []
|
84
|
+
|
85
|
+
extensions: []
|
86
|
+
|
87
|
+
extra_rdoc_files:
|
88
|
+
- LICENSE.txt
|
89
|
+
- README.rdoc
|
90
|
+
files:
|
91
|
+
- .document
|
92
|
+
- .idea/encodings.xml
|
93
|
+
- .idea/misc.xml
|
94
|
+
- .idea/modules.xml
|
95
|
+
- .idea/rubyperf.iml
|
96
|
+
- .idea/vcs.xml
|
97
|
+
- Gemfile
|
98
|
+
- Gemfile.lock
|
99
|
+
- LICENSE.txt
|
100
|
+
- README.rdoc
|
101
|
+
- Rakefile
|
102
|
+
- VERSION
|
103
|
+
- lib/perf/meter.rb
|
104
|
+
- lib/perf/meter_factory.rb
|
105
|
+
- lib/perf/no_op_meter.rb
|
106
|
+
- lib/perf/noop_measure.rb
|
107
|
+
- lib/perf/report_format.rb
|
108
|
+
- lib/perf/report_format_html.rb
|
109
|
+
- lib/perf/report_format_simple.rb
|
110
|
+
- lib/rubyperf.rb
|
111
|
+
- test/helper.rb
|
112
|
+
- test/perf_test_example.rb
|
113
|
+
- test/rubyperf_test_helpers.rb
|
114
|
+
- test/test_perf_meter.rb
|
115
|
+
has_rdoc: true
|
116
|
+
homepage: http://github.com/lpasqualis/rubyperf
|
117
|
+
licenses:
|
118
|
+
- MIT
|
119
|
+
post_install_message:
|
120
|
+
rdoc_options: []
|
121
|
+
|
122
|
+
require_paths:
|
123
|
+
- lib
|
124
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
125
|
+
none: false
|
126
|
+
requirements:
|
127
|
+
- - ">="
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
hash: 3
|
130
|
+
segments:
|
131
|
+
- 0
|
132
|
+
version: "0"
|
133
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
134
|
+
none: false
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
hash: 3
|
139
|
+
segments:
|
140
|
+
- 0
|
141
|
+
version: "0"
|
142
|
+
requirements: []
|
143
|
+
|
144
|
+
rubyforge_project:
|
145
|
+
rubygems_version: 1.4.2
|
146
|
+
signing_key:
|
147
|
+
specification_version: 3
|
148
|
+
summary: A gem to measure ruby code performance
|
149
|
+
test_files: []
|
150
|
+
|