rubyperf 1.0.0 → 1.0.1
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/Rakefile +2 -2
- data/VERSION +1 -1
- data/lib/perf/meter.rb +8 -4
- data/lib/perf/report_format_list_of_measures.rb +38 -0
- data/lib/rubyperf.rb +1 -0
- data/rubyperf.gemspec +5 -4
- data/test/perf_test_example.rb +14 -0
- data/test/test_meter_factory.rb +2 -1
- data/test/test_perf_meter.rb +140 -87
- metadata +6 -5
data/Rakefile
CHANGED
@@ -17,8 +17,8 @@ Jeweler::Tasks.new do |gem|
|
|
17
17
|
gem.name = "rubyperf"
|
18
18
|
gem.homepage = "http://github.com/lpasqualis/rubyperf"
|
19
19
|
gem.license = "MIT"
|
20
|
-
gem.summary = %Q{
|
21
|
-
gem.description = %Q{
|
20
|
+
gem.summary = %Q{rubyperf helps you measure ruby code performance}
|
21
|
+
gem.description = %Q{Used to easily measure the performance of blocks of Ruby code, expressions and methods; provides reporting in various formats}
|
22
22
|
gem.email = "lpasqualis@gmail.com"
|
23
23
|
gem.authors = ["lpasqualis"]
|
24
24
|
# dependencies defined in Gemfile
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0.
|
1
|
+
1.0.1
|
data/lib/perf/meter.rb
CHANGED
@@ -36,7 +36,7 @@ module Perf
|
|
36
36
|
end
|
37
37
|
|
38
38
|
# Takes a description and a code block and measures the performance of the block.
|
39
|
-
# It returns the value
|
39
|
+
# It returns the value returned by the block
|
40
40
|
#
|
41
41
|
# ==== Attributes
|
42
42
|
#
|
@@ -134,9 +134,9 @@ module Perf
|
|
134
134
|
end
|
135
135
|
|
136
136
|
# Puts a wrapper around a set of methods of a specific class to measure their performance.
|
137
|
-
# The set is provided with an array of
|
137
|
+
# The set is provided with an array of instance methods, and one of class methods.
|
138
138
|
#
|
139
|
-
# The method defines the wrapper,
|
139
|
+
# The method defines the wrapper, yields to the block, and then restores the instrumented class.
|
140
140
|
# This ensures that the instrumented class is restored, and that the instrumentation occurs only in the context
|
141
141
|
# of the block
|
142
142
|
#
|
@@ -360,10 +360,14 @@ protected
|
|
360
360
|
|
361
361
|
def method_missing(method_sym, *arguments, &block)
|
362
362
|
if method_sym.to_s =~ /^report_(.*)$/
|
363
|
-
klass=Object.const_get("Perf").const_get("ReportFormat#{$1
|
363
|
+
klass=Object.const_get("Perf").const_get("ReportFormat#{camelize($1)}")
|
364
364
|
return klass.new.format(self) if klass
|
365
365
|
end
|
366
366
|
super
|
367
367
|
end
|
368
|
+
|
369
|
+
def camelize(from)
|
370
|
+
from.to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
|
371
|
+
end
|
368
372
|
end
|
369
373
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2012 Lorenzo Pasqualis - DreamBox Learning, Inc
|
3
|
+
# https://github.com/lpasqualis/rubyperf
|
4
|
+
#
|
5
|
+
|
6
|
+
|
7
|
+
require 'rubyperf'
|
8
|
+
require 'cgi'
|
9
|
+
|
10
|
+
module Perf
|
11
|
+
|
12
|
+
# ReportFormatListOfMeasures is use for unit tests to list the measures taken and their count. It has no other
|
13
|
+
# real life purpose.
|
14
|
+
|
15
|
+
class ReportFormatListOfMeasures < ReportFormat
|
16
|
+
|
17
|
+
def format(perf,options={})
|
18
|
+
super.select{|x| x.length>0 }
|
19
|
+
end
|
20
|
+
|
21
|
+
def format_header(v)
|
22
|
+
""
|
23
|
+
end
|
24
|
+
|
25
|
+
def format_measure(v)
|
26
|
+
"#{v[:title]},#{v[:count]}"
|
27
|
+
end
|
28
|
+
|
29
|
+
def format_footer(v)
|
30
|
+
""
|
31
|
+
end
|
32
|
+
|
33
|
+
def format_title(what,options)
|
34
|
+
what
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
data/lib/rubyperf.rb
CHANGED
data/rubyperf.gemspec
CHANGED
@@ -5,12 +5,12 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{rubyperf}
|
8
|
-
s.version = "1.0.
|
8
|
+
s.version = "1.0.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["lpasqualis"]
|
12
|
-
s.date = %q{2012-01-
|
13
|
-
s.description = %q{
|
12
|
+
s.date = %q{2012-01-15}
|
13
|
+
s.description = %q{Used to easily measure the performance of blocks of Ruby code, expressions and methods; provides reporting in various formats}
|
14
14
|
s.email = %q{lpasqualis@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"LICENSE.txt",
|
@@ -30,6 +30,7 @@ Gem::Specification.new do |s|
|
|
30
30
|
"lib/perf/no_op_meter.rb",
|
31
31
|
"lib/perf/report_format.rb",
|
32
32
|
"lib/perf/report_format_html.rb",
|
33
|
+
"lib/perf/report_format_list_of_measures.rb",
|
33
34
|
"lib/perf/report_format_simple.rb",
|
34
35
|
"lib/rubyperf.rb",
|
35
36
|
"rubyperf.gemspec",
|
@@ -43,7 +44,7 @@ Gem::Specification.new do |s|
|
|
43
44
|
s.licenses = ["MIT"]
|
44
45
|
s.require_paths = ["lib"]
|
45
46
|
s.rubygems_version = %q{1.3.6}
|
46
|
-
s.summary = %q{
|
47
|
+
s.summary = %q{rubyperf helps you measure ruby code performance}
|
47
48
|
|
48
49
|
if s.respond_to? :specification_version then
|
49
50
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
data/test/perf_test_example.rb
CHANGED
@@ -15,5 +15,19 @@ class PerfTestExample
|
|
15
15
|
def self.static_method
|
16
16
|
(0..300000).to_a.reverse.reverse.reverse # Do something heavy
|
17
17
|
end
|
18
|
+
|
19
|
+
def test_with_measure
|
20
|
+
Perf::MeterFactory.get.measure(:test_with_measure_block) do
|
21
|
+
test(1,2,3)
|
22
|
+
PerfTestExample.static_method
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_with_measure_static
|
27
|
+
Perf::MeterFactory.get.measure(:test_with_measure_block) do
|
28
|
+
static_method
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
18
32
|
end
|
19
33
|
|
data/test/test_meter_factory.rb
CHANGED
@@ -12,9 +12,10 @@ require 'rubyperf'
|
|
12
12
|
require 'rubyperf_test_helpers'
|
13
13
|
require 'perf_test_example'
|
14
14
|
|
15
|
-
class
|
15
|
+
class TestMeterFactory < Test::Unit::TestCase
|
16
16
|
|
17
17
|
def test_basic
|
18
|
+
Perf::MeterFactory.clear_all!
|
18
19
|
m1=Perf::MeterFactory.get()
|
19
20
|
m2=Perf::MeterFactory.get()
|
20
21
|
|
data/test/test_perf_meter.rb
CHANGED
@@ -11,17 +11,87 @@ require 'perf_test_example'
|
|
11
11
|
|
12
12
|
class TestPerfMeter < Test::Unit::TestCase
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
def test_overhead
|
17
|
-
runs=3000
|
14
|
+
def test_basic
|
18
15
|
m=Perf::Meter.new
|
19
|
-
|
20
|
-
|
16
|
+
m.measure(:string_operations) do
|
17
|
+
m.measure(:ciao) do
|
18
|
+
1000.times do; "CIAO"*100; end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
m.measure(:string_operations) do
|
22
|
+
m.measure(:help) do
|
23
|
+
1000.times do; "HELP"*100; end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
m.measure(:emtpy_loop) do
|
27
|
+
50000.times do; end;
|
28
|
+
end
|
29
|
+
m.measure(:rough_overhead_x10000) do
|
30
|
+
1000.times do
|
31
|
+
m.measure(:block_1) do
|
32
|
+
m.measure(:block_1_1) do
|
33
|
+
end
|
34
|
+
m.measure(:block_1_2) do
|
35
|
+
m.measure(:block_1_2_1) do
|
36
|
+
end
|
37
|
+
m.measure(:block_1_2_2) do
|
38
|
+
end
|
39
|
+
m.measure(:block_1_2_3) do
|
40
|
+
m.measure_result(:bool_exp_1_2_3) { false }
|
41
|
+
m.measure_result(:bool_exp_1_2_3) { true }
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
21
47
|
|
22
|
-
|
23
|
-
|
24
|
-
|
48
|
+
m.measure(:sleep1) do
|
49
|
+
m.measure(:sleep1_1) do
|
50
|
+
sleep(0.01)
|
51
|
+
end
|
52
|
+
m.measure(:sleep_1_2) do
|
53
|
+
sleep(0.02)
|
54
|
+
end
|
55
|
+
m.measure(:sleep_1_3) do
|
56
|
+
sleep(0.03)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
m.measure(:empty) do
|
60
|
+
end
|
61
|
+
m.measure_result("test") { sleep(1) }
|
62
|
+
m.measure_result("test") { false }
|
63
|
+
m.measure_result("test") { false }
|
64
|
+
|
65
|
+
m.method_meters(Array,[:sort,:reverse],[:new]) do
|
66
|
+
Array.new(1000000,"abc").reverse.sort
|
67
|
+
end
|
68
|
+
|
69
|
+
assert_equal ['\blocks,0',
|
70
|
+
'\blocks\empty,1',
|
71
|
+
'\blocks\emtpy_loop,1',
|
72
|
+
'\blocks\rough_overhead_x10000,1',
|
73
|
+
'\blocks\rough_overhead_x10000\block_1,1000',
|
74
|
+
'\blocks\rough_overhead_x10000\block_1\block_1_1,1000',
|
75
|
+
'\blocks\rough_overhead_x10000\block_1\block_1_2,1000',
|
76
|
+
'\blocks\rough_overhead_x10000\block_1\block_1_2\block_1_2_1,1000',
|
77
|
+
'\blocks\rough_overhead_x10000\block_1\block_1_2\block_1_2_2,1000',
|
78
|
+
'\blocks\rough_overhead_x10000\block_1\block_1_2\block_1_2_3,1000',
|
79
|
+
'\blocks\rough_overhead_x10000\block_1\block_1_2\block_1_2_3\bool_exp_1_2_3 = "false",1000',
|
80
|
+
'\blocks\rough_overhead_x10000\block_1\block_1_2\block_1_2_3\bool_exp_1_2_3 = "true",1000',
|
81
|
+
'\blocks\sleep1,1',
|
82
|
+
'\blocks\sleep1\sleep1_1,1',
|
83
|
+
'\blocks\sleep1\sleep_1_2,1',
|
84
|
+
'\blocks\sleep1\sleep_1_3,1',
|
85
|
+
'\blocks\string_operations,2',
|
86
|
+
'\blocks\string_operations\ciao,1',
|
87
|
+
'\blocks\string_operations\help,1',
|
88
|
+
'\blocks\test = "1",1',
|
89
|
+
'\blocks\test = "false",2',
|
90
|
+
'\methods,0',
|
91
|
+
'\methods\#<Class:Array>.new,1',
|
92
|
+
'\methods\Array.reverse,1',
|
93
|
+
'\methods\Array.sort,1'],
|
94
|
+
m.report_list_of_measures
|
25
95
|
end
|
26
96
|
|
27
97
|
def test_method_not_corrupted_after_restoring
|
@@ -36,7 +106,15 @@ class TestPerfMeter < Test::Unit::TestCase
|
|
36
106
|
end
|
37
107
|
assert PerfTestExample.methods.sort == cmethods
|
38
108
|
assert PerfTestExample.new.methods.sort == imethods
|
39
|
-
|
109
|
+
|
110
|
+
assert_equal ['\methods,0',
|
111
|
+
'\methods\#<Class:PerfTestExample>.static_method,1',
|
112
|
+
'\methods\PerfTestExample.test,1',
|
113
|
+
'\methods\PerfTestExample.test_np,1'],
|
114
|
+
m.report_list_of_measures
|
115
|
+
|
116
|
+
assert_equal 6,m.report_simple.length
|
117
|
+
assert_equal 6,m.report_html.length
|
40
118
|
end
|
41
119
|
|
42
120
|
def test_method_metering
|
@@ -47,7 +125,26 @@ class TestPerfMeter < Test::Unit::TestCase
|
|
47
125
|
a.test_np
|
48
126
|
PerfTestExample.static_method
|
49
127
|
end
|
50
|
-
|
128
|
+
|
129
|
+
assert_equal ['\methods,0',
|
130
|
+
'\methods\#<Class:PerfTestExample>.static_method,1',
|
131
|
+
'\methods\PerfTestExample.test,1',
|
132
|
+
'\methods\PerfTestExample.test_np,1'],
|
133
|
+
m.report_list_of_measures
|
134
|
+
end
|
135
|
+
|
136
|
+
def test_methods_with_measure
|
137
|
+
Perf::MeterFactory.clear_all!
|
138
|
+
m=Perf::MeterFactory.get
|
139
|
+
m.method_meters(PerfTestExample,[:test,:test_np,:test_with_measure],[:static_method]) do
|
140
|
+
a=PerfTestExample.new
|
141
|
+
a.test(1,2,3)
|
142
|
+
a.test_np
|
143
|
+
a.test_with_measure
|
144
|
+
PerfTestExample.static_method
|
145
|
+
end
|
146
|
+
assert_equal 10,m.report_simple.length
|
147
|
+
assert_equal 10,m.report_html.length
|
51
148
|
end
|
52
149
|
|
53
150
|
def test_base_report
|
@@ -70,17 +167,10 @@ class TestPerfMeter < Test::Unit::TestCase
|
|
70
167
|
"#{Perf::Meter::PATH_MEASURES}\\d",
|
71
168
|
"#{Perf::Meter::PATH_MEASURES}\\b",
|
72
169
|
"#{Perf::Meter::PATH_MEASURES}"])
|
73
|
-
puts m.report_simple if ALLOW_OUTPUT
|
74
|
-
end
|
75
|
-
|
76
|
-
def test_output_html
|
77
|
-
m=RubyperfTestHelpers.get_measure
|
78
|
-
htmlcode=m.report_html
|
79
|
-
puts htmlcode if ALLOW_OUTPUT
|
80
170
|
end
|
81
171
|
|
82
172
|
def test_exception_handling
|
83
|
-
# An
|
173
|
+
# An exception thrown in a block that we are measuring needs to leave the Perf::Meter in a good state.
|
84
174
|
# This test checks the state after an exception.
|
85
175
|
exception_raised = false
|
86
176
|
measuring_correct = false
|
@@ -105,7 +195,6 @@ class TestPerfMeter < Test::Unit::TestCase
|
|
105
195
|
assert exception_raised
|
106
196
|
assert measuring_correct
|
107
197
|
assert stack_correct
|
108
|
-
puts m.report_simple if ALLOW_OUTPUT
|
109
198
|
end
|
110
199
|
|
111
200
|
def test_return_values
|
@@ -121,8 +210,6 @@ class TestPerfMeter < Test::Unit::TestCase
|
|
121
210
|
assert_equal 5,m.measure_result(:five) {5}
|
122
211
|
assert_equal "byebye",m.measure_result(:byebye) {"bye"+"bye"}
|
123
212
|
end
|
124
|
-
|
125
|
-
puts m.report_simple if ALLOW_OUTPUT
|
126
213
|
end
|
127
214
|
|
128
215
|
def test_nesting_measure
|
@@ -130,14 +217,14 @@ class TestPerfMeter < Test::Unit::TestCase
|
|
130
217
|
m.measure(:a) { }
|
131
218
|
m.measure(:b) { }
|
132
219
|
m.measure(:d) { m.measure(:c) { m.measure(:d) {} }}
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
220
|
+
|
221
|
+
assert_equal ['\blocks,0',
|
222
|
+
'\blocks\a,1',
|
223
|
+
'\blocks\b,1',
|
224
|
+
'\blocks\d,1',
|
225
|
+
'\blocks\d\c,1',
|
226
|
+
'\blocks\d\c\d,1'],
|
227
|
+
m.report_list_of_measures
|
141
228
|
end
|
142
229
|
|
143
230
|
def test_measure_instance_method
|
@@ -180,65 +267,31 @@ class TestPerfMeter < Test::Unit::TestCase
|
|
180
267
|
a.test_np
|
181
268
|
#puts puts m.report_simple
|
182
269
|
m.restore_all_methods(PerfTestExample)
|
183
|
-
|
270
|
+
assert_equal ['\blocks,0',
|
271
|
+
'\blocks\measure_test,1',
|
272
|
+
'\blocks\measure_test_np,1',
|
273
|
+
'\blocks\some_expressions,1',
|
274
|
+
'\blocks\some_expressions\expression1 = "1111",1',
|
275
|
+
'\blocks\some_expressions\expression1 = "13579",1',
|
276
|
+
'\blocks\some_expressions\expression2 = "string",1',
|
277
|
+
'\methods,0',
|
278
|
+
'\methods\#<Class:PerfTestExample>.static_method,1',
|
279
|
+
'\methods\PerfTestExample.test,1',
|
280
|
+
'\methods\PerfTestExample.test_np,2'],
|
281
|
+
m.report_list_of_measures
|
184
282
|
end
|
185
283
|
|
186
|
-
def test_basic
|
187
|
-
m=Perf::Meter.new
|
188
|
-
m.measure(:string_operations) do
|
189
|
-
m.measure(:ciao) do
|
190
|
-
1000.times do; "CIAO"*100; end
|
191
|
-
end
|
192
|
-
end
|
193
|
-
m.measure(:string_operations) do
|
194
|
-
m.measure(:help) do
|
195
|
-
1000.times do; "HELP"*100; end
|
196
|
-
end
|
197
|
-
end
|
198
|
-
m.measure(:emtpy_loop) do
|
199
|
-
50000.times do; end;
|
200
|
-
end
|
201
|
-
m.measure(:rough_overhead_x10000) do
|
202
|
-
1000.times do
|
203
|
-
m.measure(:block_1) do
|
204
|
-
m.measure(:block_1_1) do
|
205
|
-
end
|
206
|
-
m.measure(:block_1_2) do
|
207
|
-
m.measure(:block_1_2_1) do
|
208
|
-
end
|
209
|
-
m.measure(:block_1_2_2) do
|
210
|
-
end
|
211
|
-
m.measure(:block_1_2_3) do
|
212
|
-
m.measure_result(:bool_exp_1_2_3) { false }
|
213
|
-
m.measure_result(:bool_exp_1_2_3) { true }
|
214
|
-
end
|
215
|
-
end
|
216
|
-
end
|
217
|
-
end
|
218
|
-
end
|
219
|
-
|
220
|
-
m.measure(:sleep1) do
|
221
|
-
m.measure(:sleep1_1) do
|
222
|
-
sleep(0.01)
|
223
|
-
end
|
224
|
-
m.measure(:sleep_1_2) do
|
225
|
-
sleep(0.02)
|
226
|
-
end
|
227
|
-
m.measure(:sleep_1_3) do
|
228
|
-
sleep(0.03)
|
229
|
-
end
|
230
|
-
end
|
231
|
-
m.measure(:empty) do
|
232
|
-
end
|
233
|
-
m.measure_result("test") { sleep(1) }
|
234
|
-
m.measure_result("test") { false }
|
235
|
-
m.measure_result("test") { false }
|
236
|
-
|
237
|
-
m.method_meters(Array,[:sort,:reverse],[:new]) do
|
238
|
-
Array.new(1000000,"abc").reverse.sort
|
239
|
-
end
|
240
|
-
|
241
|
-
puts m.report_simple if ALLOW_OUTPUT
|
242
284
|
|
285
|
+
def test_overhead
|
286
|
+
runs=1_000
|
287
|
+
a=(1..100_000).to_a
|
288
|
+
m=Perf::Meter.new
|
289
|
+
b1=Benchmark.measure { runs.times { m.measure(:a) { a.reverse! } } }
|
290
|
+
b2=Benchmark.measure { runs.times { a.reverse! } }
|
291
|
+
assert_equal ['\blocks,0',
|
292
|
+
'\blocks\a,1000'],
|
293
|
+
m.report_list_of_measures
|
294
|
+
# Here we should assert if the overhead is > a certain percentage.
|
295
|
+
# puts "Measurement overhead x 1000 = #{b1-b2}"
|
243
296
|
end
|
244
297
|
end
|
metadata
CHANGED
@@ -5,9 +5,9 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 1
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 1
|
9
9
|
segments_generated: true
|
10
|
-
version: 1.0.
|
10
|
+
version: 1.0.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- lpasqualis
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-01-
|
18
|
+
date: 2012-01-15 00:00:00 -08:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -74,7 +74,7 @@ dependencies:
|
|
74
74
|
segments_generated: true
|
75
75
|
version: "0"
|
76
76
|
requirement: *id004
|
77
|
-
description:
|
77
|
+
description: Used to easily measure the performance of blocks of Ruby code, expressions and methods; provides reporting in various formats
|
78
78
|
email: lpasqualis@gmail.com
|
79
79
|
executables: []
|
80
80
|
|
@@ -97,6 +97,7 @@ files:
|
|
97
97
|
- lib/perf/no_op_meter.rb
|
98
98
|
- lib/perf/report_format.rb
|
99
99
|
- lib/perf/report_format_html.rb
|
100
|
+
- lib/perf/report_format_list_of_measures.rb
|
100
101
|
- lib/perf/report_format_simple.rb
|
101
102
|
- lib/rubyperf.rb
|
102
103
|
- rubyperf.gemspec
|
@@ -136,6 +137,6 @@ rubyforge_project:
|
|
136
137
|
rubygems_version: 1.3.6
|
137
138
|
signing_key:
|
138
139
|
specification_version: 3
|
139
|
-
summary:
|
140
|
+
summary: rubyperf helps you measure ruby code performance
|
140
141
|
test_files: []
|
141
142
|
|