rubyperf 0.1.0 → 1.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/VERSION +1 -1
- data/lib/perf/measure.rb +28 -0
- data/lib/perf/meter.rb +48 -53
- data/lib/perf/meter_factory.rb +3 -1
- data/lib/perf/no_op_meter.rb +10 -2
- data/lib/perf/report_format.rb +7 -7
- data/lib/perf/report_format_html.rb +2 -2
- data/lib/rubyperf.rb +1 -0
- data/rubyperf.gemspec +6 -4
- data/test/test_meter_factory.rb +50 -0
- data/test/test_perf_meter.rb +33 -16
- metadata +17 -22
- data/lib/perf/noop_measure.rb +0 -39
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
1.0.0
|
data/lib/perf/measure.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'rubyperf'
|
2
|
+
|
3
|
+
module Perf
|
4
|
+
class Measure
|
5
|
+
attr_accessor :path
|
6
|
+
attr_accessor :count
|
7
|
+
attr_accessor :time
|
8
|
+
attr_accessor :measuring
|
9
|
+
|
10
|
+
def initialize(measure_path)
|
11
|
+
@path = measure_path
|
12
|
+
@count = 0
|
13
|
+
@time = Benchmark::Tms.new
|
14
|
+
@measuring = 0
|
15
|
+
end
|
16
|
+
|
17
|
+
def measuring?
|
18
|
+
@measuring>0
|
19
|
+
end
|
20
|
+
|
21
|
+
def merge(m)
|
22
|
+
@count += m.count
|
23
|
+
@time += m.time
|
24
|
+
@measuring += m.measuring
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
data/lib/perf/meter.rb
CHANGED
@@ -20,13 +20,19 @@ module Perf
|
|
20
20
|
METHOD_TYPE_CLASS = :class
|
21
21
|
|
22
22
|
attr_accessor :measurements
|
23
|
-
attr_accessor :
|
23
|
+
attr_accessor :current_path
|
24
24
|
|
25
25
|
def initialize
|
26
|
-
@measurements = {}
|
27
|
-
@
|
26
|
+
@measurements = {} # A hash of Measure
|
27
|
+
@current_path = nil
|
28
28
|
@instrumented_methods = {METHOD_TYPE_INSTANCE=>[],METHOD_TYPE_CLASS=>[]}
|
29
29
|
@class_methods = []
|
30
|
+
#@overhead = nil
|
31
|
+
#@overhead = Benchmark.measure do
|
32
|
+
# measure(:a) {}
|
33
|
+
#end
|
34
|
+
#@overhead = nil
|
35
|
+
@measurements = {} # A hash of Measure
|
30
36
|
end
|
31
37
|
|
32
38
|
# Takes a description and a code block and measures the performance of the block.
|
@@ -69,15 +75,33 @@ module Perf
|
|
69
75
|
# end
|
70
76
|
#
|
71
77
|
|
72
|
-
def measure(what,&code)
|
73
|
-
|
74
|
-
@
|
78
|
+
def measure(what,root_path=PATH_MEASURES,&code)
|
79
|
+
current_path=@current_path
|
80
|
+
if @current_path.nil?
|
81
|
+
@current_path=root_path
|
82
|
+
root=get_measurement(@current_path)
|
83
|
+
else
|
84
|
+
root=nil
|
85
|
+
end
|
86
|
+
@current_path+= "\\#{what}"
|
87
|
+
res=nil
|
75
88
|
begin
|
76
|
-
|
77
|
-
|
89
|
+
m=get_measurement(@current_path)
|
90
|
+
m.count += 1
|
91
|
+
m.measuring +=1
|
92
|
+
if m.measuring>1
|
93
|
+
res=code.call
|
94
|
+
else
|
95
|
+
t = Benchmark.measure { res=code.call }
|
96
|
+
#t -= @overhead if @overhead
|
97
|
+
#if t.total>=0 && t.real>=0
|
98
|
+
m.time += t
|
99
|
+
root.time += t if root
|
100
|
+
#end
|
78
101
|
end
|
79
102
|
ensure
|
80
|
-
@
|
103
|
+
@current_path=current_path
|
104
|
+
m.measuring-=1
|
81
105
|
end
|
82
106
|
res
|
83
107
|
end
|
@@ -104,7 +128,7 @@ module Perf
|
|
104
128
|
#
|
105
129
|
|
106
130
|
def measure_result(what,&code)
|
107
|
-
res=measure(what,&code)
|
131
|
+
res=measure(what,PATH_MEASURES,&code)
|
108
132
|
merge_measures(what,"#{what} = \"#{res.to_s}\"")
|
109
133
|
res
|
110
134
|
end
|
@@ -247,29 +271,10 @@ module Perf
|
|
247
271
|
restore_all_class_methods(klass)
|
248
272
|
end
|
249
273
|
|
250
|
-
|
251
|
-
|
252
|
-
def measure_full_path(path,&code)
|
253
|
-
m=get_measurement(path)
|
254
|
-
m[:count] += 1
|
255
|
-
if m[:measuring]
|
256
|
-
res=code.call
|
257
|
-
else
|
258
|
-
res=nil
|
259
|
-
m[:measuring] = true
|
260
|
-
begin
|
261
|
-
m[:time] += Benchmark.measure { res=code.call }
|
262
|
-
ensure
|
263
|
-
m[:measuring] = false
|
264
|
-
end
|
265
|
-
end
|
266
|
-
res
|
267
|
-
end
|
268
|
-
|
269
|
-
private
|
274
|
+
protected
|
270
275
|
|
271
276
|
def set_measurement(path,m)
|
272
|
-
@measurements[path]=m
|
277
|
+
@measurements[path]=m if m.is_a? Perf::Measure
|
273
278
|
end
|
274
279
|
|
275
280
|
def get_current_path
|
@@ -277,14 +282,14 @@ private
|
|
277
282
|
end
|
278
283
|
|
279
284
|
def merge_measures(what_from,what_to)
|
280
|
-
|
281
|
-
|
282
|
-
|
285
|
+
path_from = "#{@current_path || PATH_MEASURES}\\#{what_from}"
|
286
|
+
path_to = "#{@current_path || PATH_MEASURES}\\#{what_to}"
|
287
|
+
|
283
288
|
m_from = get_measurement(path_from)
|
284
289
|
m_to = get_measurement(path_to)
|
285
|
-
|
286
|
-
m_to
|
287
|
-
|
290
|
+
|
291
|
+
m_to.merge(m_from)
|
292
|
+
|
288
293
|
clear_measurement(path_from)
|
289
294
|
end
|
290
295
|
|
@@ -293,29 +298,19 @@ private
|
|
293
298
|
end
|
294
299
|
|
295
300
|
def get_measurement(path)
|
296
|
-
@measurements[path] ||=
|
297
|
-
:time => Benchmark::Tms.new,
|
298
|
-
:measuring => false}
|
301
|
+
@measurements[path] ||= Perf::Measure.new(path)
|
299
302
|
end
|
300
303
|
|
301
304
|
def measure_method_by_type(klass,method_name,type)
|
302
305
|
unless @instrumented_methods[type].find{|x| x[:klass]==klass && x[:method]==method_name}
|
303
|
-
klass_path="#{PATH_METHODS}\\#{klass}"
|
304
|
-
m = get_measurement("#{klass_path}\\#{method_name}")
|
305
306
|
old_method_symbol="rubyperf_org_#{method_name}".to_sym
|
306
|
-
@instrumented_methods[type] << { :klass=>klass, :method=>method_name, :
|
307
|
-
perf=self
|
307
|
+
@instrumented_methods[type] << { :klass=>klass, :method=>method_name, :org=>old_method_symbol }
|
308
308
|
klass.send(:alias_method, old_method_symbol,method_name)
|
309
|
+
perf=self
|
309
310
|
klass.send(:define_method,method_name) do |*args|
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
perf.measure_full_path(klass_path) do
|
314
|
-
Benchmark.measure{ res=self.send(old_method_symbol, *args) }
|
315
|
-
end
|
316
|
-
end
|
317
|
-
m[:time] += t
|
318
|
-
res
|
311
|
+
perf.measure("#{klass}.#{method_name}",PATH_METHODS) do
|
312
|
+
self.send(old_method_symbol, *args)
|
313
|
+
end
|
319
314
|
end
|
320
315
|
end
|
321
316
|
end
|
data/lib/perf/meter_factory.rb
CHANGED
@@ -8,11 +8,13 @@ module Perf
|
|
8
8
|
# Simple Perf::Meter factory and singleton management.
|
9
9
|
# Useful to not have to pass around Perf::Meter objects and still be able to generate stats in various parts of
|
10
10
|
# the code.
|
11
|
-
|
11
|
+
|
12
12
|
class MeterFactory
|
13
13
|
|
14
14
|
DEFAULT_METER = :default
|
15
15
|
|
16
|
+
@@perf_meters=nil
|
17
|
+
|
16
18
|
# Returns a Perf::Meter with a given key, and creates it lazly if it doesn't exist'.
|
17
19
|
def self.get(key=DEFAULT_METER)
|
18
20
|
@@perf_meters ||= {}
|
data/lib/perf/no_op_meter.rb
CHANGED
@@ -3,6 +3,8 @@
|
|
3
3
|
# https://github.com/lpasqualis/rubyperf
|
4
4
|
#
|
5
5
|
|
6
|
+
require "rubyperf"
|
7
|
+
|
6
8
|
module Perf
|
7
9
|
#
|
8
10
|
# This class can be used in substitution to a Perf::Meter class to avoid overhead when performance measurements is not
|
@@ -16,8 +18,6 @@ module Perf
|
|
16
18
|
def clear
|
17
19
|
end
|
18
20
|
|
19
|
-
#############################################################################################################
|
20
|
-
|
21
21
|
def measure(what,&code)
|
22
22
|
yield
|
23
23
|
end
|
@@ -55,6 +55,14 @@ module Perf
|
|
55
55
|
yield
|
56
56
|
end
|
57
57
|
|
58
|
+
def method_missing(method_sym, *arguments, &block)
|
59
|
+
if method_sym.to_s =~ /^report_(.*)$/
|
60
|
+
klass=Object.const_get("Perf").const_get("ReportFormat#{$1.capitalize}")
|
61
|
+
return klass.new.format(self) if klass
|
62
|
+
end
|
63
|
+
super
|
64
|
+
end
|
65
|
+
|
58
66
|
end
|
59
67
|
|
60
68
|
end
|
data/lib/perf/report_format.rb
CHANGED
@@ -38,15 +38,15 @@ module Perf
|
|
38
38
|
path = what.split("\\")
|
39
39
|
|
40
40
|
max_title = title_len if title_len>max_title
|
41
|
-
max_count = m
|
41
|
+
max_count = m.count.to_s.length if m.count.to_s.length>max_count
|
42
42
|
|
43
|
-
total += m
|
43
|
+
total += m.time if path.size==2 # This calculates the max of the level-1 entries needed for the root entry.
|
44
44
|
end
|
45
45
|
|
46
46
|
totals=[total.real]
|
47
47
|
depth=1
|
48
48
|
keys_in_order.each do |what|
|
49
|
-
m=perf.measurements[what]
|
49
|
+
m = perf.measurements[what]
|
50
50
|
path = what.split("\\")
|
51
51
|
if path.size-1 != depth
|
52
52
|
if path.size-1 > depth
|
@@ -56,9 +56,9 @@ module Perf
|
|
56
56
|
end
|
57
57
|
depth=path.size-1
|
58
58
|
end
|
59
|
-
totals[totals.size-1] = m
|
59
|
+
totals[totals.size-1] = m.time.real
|
60
60
|
totals[totals.size-1] = MIN_TOTAL_TIME if totals[totals.size-1]<MIN_TOTAL_TIME
|
61
|
-
percents[what]=(m
|
61
|
+
percents[what]=(m.time.real*100.0)/totals[totals.size-2]
|
62
62
|
end
|
63
63
|
|
64
64
|
# Header
|
@@ -76,8 +76,8 @@ module Perf
|
|
76
76
|
title = format_title(what,options)
|
77
77
|
rep << format_measure(:title => title, :max_title => max_title,
|
78
78
|
:percent => percents[what]||0.0,
|
79
|
-
:count => m
|
80
|
-
:time => m
|
79
|
+
:count => m.count, :max_count => max_count,
|
80
|
+
:time => m.time,
|
81
81
|
:options => options)
|
82
82
|
end
|
83
83
|
|
@@ -9,8 +9,8 @@ require 'cgi'
|
|
9
9
|
module Perf
|
10
10
|
class ReportFormatHtml < ReportFormat
|
11
11
|
|
12
|
-
PERCENT_FORMAT
|
13
|
-
INDENT
|
12
|
+
PERCENT_FORMAT = "%.3f"
|
13
|
+
INDENT = " "*3
|
14
14
|
|
15
15
|
def format_header(v)
|
16
16
|
"<table class='rubyperf_report_format_html_table'><tr><th>#{v[:title]}</th><th>%</th><th>count</th><th>user</th><th>system</th><th>total</th><th>real</th></tr>"
|
data/lib/rubyperf.rb
CHANGED
data/rubyperf.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{rubyperf}
|
8
|
-
s.version = "
|
8
|
+
s.version = "1.0.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["lpasqualis"]
|
@@ -24,10 +24,10 @@ Gem::Specification.new do |s|
|
|
24
24
|
"README.rdoc",
|
25
25
|
"Rakefile",
|
26
26
|
"VERSION",
|
27
|
+
"lib/perf/measure.rb",
|
27
28
|
"lib/perf/meter.rb",
|
28
29
|
"lib/perf/meter_factory.rb",
|
29
30
|
"lib/perf/no_op_meter.rb",
|
30
|
-
"lib/perf/noop_measure.rb",
|
31
31
|
"lib/perf/report_format.rb",
|
32
32
|
"lib/perf/report_format_html.rb",
|
33
33
|
"lib/perf/report_format_simple.rb",
|
@@ -36,18 +36,20 @@ Gem::Specification.new do |s|
|
|
36
36
|
"test/helper.rb",
|
37
37
|
"test/perf_test_example.rb",
|
38
38
|
"test/rubyperf_test_helpers.rb",
|
39
|
+
"test/test_meter_factory.rb",
|
39
40
|
"test/test_perf_meter.rb"
|
40
41
|
]
|
41
42
|
s.homepage = %q{http://github.com/lpasqualis/rubyperf}
|
42
43
|
s.licenses = ["MIT"]
|
43
44
|
s.require_paths = ["lib"]
|
44
|
-
s.rubygems_version = %q{1.
|
45
|
+
s.rubygems_version = %q{1.3.6}
|
45
46
|
s.summary = %q{A gem to measure ruby code performance}
|
46
47
|
|
47
48
|
if s.respond_to? :specification_version then
|
49
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
48
50
|
s.specification_version = 3
|
49
51
|
|
50
|
-
if Gem::Version.new(Gem::
|
52
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
51
53
|
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
52
54
|
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
53
55
|
s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
|
@@ -0,0 +1,50 @@
|
|
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
|
+
def test_basic
|
18
|
+
m1=Perf::MeterFactory.get()
|
19
|
+
m2=Perf::MeterFactory.get()
|
20
|
+
|
21
|
+
m1.measure(:a) {}
|
22
|
+
m1.measure(:b) {}
|
23
|
+
|
24
|
+
assert m1.eql?(m2)
|
25
|
+
assert_equal 3, m2.measurements.count
|
26
|
+
assert_equal 3, m1.measurements.count
|
27
|
+
assert_equal 1,Perf::MeterFactory.all.length
|
28
|
+
|
29
|
+
m3=Perf::MeterFactory.get(:some_meter)
|
30
|
+
m4=Perf::MeterFactory.get(:some_meter)
|
31
|
+
|
32
|
+
assert m3.eql? m4
|
33
|
+
assert !(m1.eql? m3)
|
34
|
+
assert_equal 2,Perf::MeterFactory.all.length
|
35
|
+
|
36
|
+
Perf::MeterFactory.clear_meter(:some_meter)
|
37
|
+
assert_equal 1,Perf::MeterFactory.all.length
|
38
|
+
|
39
|
+
Perf::MeterFactory.clear_all!
|
40
|
+
assert_equal 0,Perf::MeterFactory.all.length
|
41
|
+
|
42
|
+
ameter = Perf::Meter.new
|
43
|
+
Perf::MeterFactory.set_meter(:ameter,ameter)
|
44
|
+
assert (ameter.eql? Perf::MeterFactory.get(:ameter))
|
45
|
+
|
46
|
+
Perf::MeterFactory.set_default(ameter)
|
47
|
+
assert (ameter.eql? Perf::MeterFactory.get)
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
data/test/test_perf_meter.rb
CHANGED
@@ -4,27 +4,24 @@
|
|
4
4
|
#
|
5
5
|
|
6
6
|
require "test/unit"
|
7
|
-
|
8
7
|
require 'helper'
|
9
|
-
|
10
8
|
require 'rubyperf'
|
11
|
-
|
12
9
|
require 'rubyperf_test_helpers'
|
13
10
|
require 'perf_test_example'
|
14
11
|
|
15
12
|
class TestPerfMeter < Test::Unit::TestCase
|
16
13
|
|
17
|
-
|
18
|
-
# to set up fixture information.
|
19
|
-
def setup
|
20
|
-
# Do nothing
|
21
|
-
end
|
14
|
+
ALLOW_OUTPUT = false
|
22
15
|
|
23
|
-
|
24
|
-
|
16
|
+
def test_overhead
|
17
|
+
runs=3000
|
18
|
+
m=Perf::Meter.new
|
19
|
+
b1=Benchmark.measure { runs.times { m.measure(:a) { } }}
|
20
|
+
b2=Benchmark.measure {runs.times {} }
|
25
21
|
|
26
|
-
|
27
|
-
|
22
|
+
puts b1 if ALLOW_OUTPUT
|
23
|
+
puts b2 if ALLOW_OUTPUT
|
24
|
+
puts b1-b2 if ALLOW_OUTPUT
|
28
25
|
end
|
29
26
|
|
30
27
|
def test_method_not_corrupted_after_restoring
|
@@ -39,6 +36,7 @@ class TestPerfMeter < Test::Unit::TestCase
|
|
39
36
|
end
|
40
37
|
assert PerfTestExample.methods.sort == cmethods
|
41
38
|
assert PerfTestExample.new.methods.sort == imethods
|
39
|
+
puts m.report_simple if ALLOW_OUTPUT
|
42
40
|
end
|
43
41
|
|
44
42
|
def test_method_metering
|
@@ -49,7 +47,7 @@ class TestPerfMeter < Test::Unit::TestCase
|
|
49
47
|
a.test_np
|
50
48
|
PerfTestExample.static_method
|
51
49
|
end
|
52
|
-
m.report_simple
|
50
|
+
puts m.report_simple if ALLOW_OUTPUT
|
53
51
|
end
|
54
52
|
|
55
53
|
def test_base_report
|
@@ -57,23 +55,28 @@ class TestPerfMeter < Test::Unit::TestCase
|
|
57
55
|
m.measure(:a) { }
|
58
56
|
m.measure(:b) { }
|
59
57
|
m.measure(:d) { m.measure(:c) { m.measure(:d) {} }}
|
58
|
+
|
60
59
|
assert_not_nil m.measurements["#{Perf::Meter::PATH_MEASURES}\\d\\c\\d"]
|
61
60
|
assert_not_nil m.measurements["#{Perf::Meter::PATH_MEASURES}\\d\\c"]
|
62
61
|
assert_not_nil m.measurements["#{Perf::Meter::PATH_MEASURES}\\d"]
|
63
62
|
assert_not_nil m.measurements["#{Perf::Meter::PATH_MEASURES}\\b"]
|
64
63
|
assert_not_nil m.measurements["#{Perf::Meter::PATH_MEASURES}\\a"]
|
65
64
|
assert_not_nil m.measurements["#{Perf::Meter::PATH_MEASURES}"]
|
65
|
+
assert_equal 6,m.measurements.size
|
66
|
+
|
66
67
|
assert_nil m.measurements["#{Perf::Meter::PATH_MEASURES}\\huh"]
|
67
68
|
assert RubyperfTestHelpers.verify_report(m,["#{Perf::Meter::PATH_MEASURES}\\d\\c\\d",
|
68
69
|
"#{Perf::Meter::PATH_MEASURES}\\d\\c",
|
69
70
|
"#{Perf::Meter::PATH_MEASURES}\\d",
|
70
71
|
"#{Perf::Meter::PATH_MEASURES}\\b",
|
71
72
|
"#{Perf::Meter::PATH_MEASURES}"])
|
73
|
+
puts m.report_simple if ALLOW_OUTPUT
|
72
74
|
end
|
73
75
|
|
74
76
|
def test_output_html
|
75
77
|
m=RubyperfTestHelpers.get_measure
|
76
|
-
m.report_html
|
78
|
+
htmlcode=m.report_html
|
79
|
+
puts htmlcode if ALLOW_OUTPUT
|
77
80
|
end
|
78
81
|
|
79
82
|
def test_exception_handling
|
@@ -86,20 +89,23 @@ class TestPerfMeter < Test::Unit::TestCase
|
|
86
89
|
|
87
90
|
begin
|
88
91
|
m.measure(:some_exception) do
|
92
|
+
sleep 0.2
|
89
93
|
a=12/0 # Divide by zero
|
94
|
+
sleep 0.2
|
90
95
|
end
|
91
96
|
rescue
|
92
97
|
exception_raised=true
|
93
98
|
ensure
|
94
99
|
measuring_correct=true
|
95
100
|
m.measurements.each_pair do |_,x|
|
96
|
-
measuring_correct=false if x
|
101
|
+
measuring_correct=false if x.measuring?
|
97
102
|
end
|
98
|
-
stack_correct =
|
103
|
+
stack_correct = m.current_path.nil?
|
99
104
|
end
|
100
105
|
assert exception_raised
|
101
106
|
assert measuring_correct
|
102
107
|
assert stack_correct
|
108
|
+
puts m.report_simple if ALLOW_OUTPUT
|
103
109
|
end
|
104
110
|
|
105
111
|
def test_return_values
|
@@ -110,6 +116,13 @@ class TestPerfMeter < Test::Unit::TestCase
|
|
110
116
|
|
111
117
|
assert_equal 5,m.measure_result(:five) {5}
|
112
118
|
assert_equal "byebye",m.measure_result(:byebye) {"bye"+"bye"}
|
119
|
+
|
120
|
+
m.measure(:in_here_too) do
|
121
|
+
assert_equal 5,m.measure_result(:five) {5}
|
122
|
+
assert_equal "byebye",m.measure_result(:byebye) {"bye"+"bye"}
|
123
|
+
end
|
124
|
+
|
125
|
+
puts m.report_simple if ALLOW_OUTPUT
|
113
126
|
end
|
114
127
|
|
115
128
|
def test_nesting_measure
|
@@ -124,6 +137,7 @@ class TestPerfMeter < Test::Unit::TestCase
|
|
124
137
|
assert_not_nil m.measurements["#{Perf::Meter::PATH_MEASURES}\\a"]
|
125
138
|
assert_not_nil m.measurements["#{Perf::Meter::PATH_MEASURES}"]
|
126
139
|
assert_nil m.measurements["#{Perf::Meter::PATH_MEASURES}\\huh"]
|
140
|
+
puts m.report_simple if ALLOW_OUTPUT
|
127
141
|
end
|
128
142
|
|
129
143
|
def test_measure_instance_method
|
@@ -166,6 +180,7 @@ class TestPerfMeter < Test::Unit::TestCase
|
|
166
180
|
a.test_np
|
167
181
|
#puts puts m.report_simple
|
168
182
|
m.restore_all_methods(PerfTestExample)
|
183
|
+
puts m.report_simple if ALLOW_OUTPUT
|
169
184
|
end
|
170
185
|
|
171
186
|
def test_basic
|
@@ -223,5 +238,7 @@ class TestPerfMeter < Test::Unit::TestCase
|
|
223
238
|
Array.new(1000000,"abc").reverse.sort
|
224
239
|
end
|
225
240
|
|
241
|
+
puts m.report_simple if ALLOW_OUTPUT
|
242
|
+
|
226
243
|
end
|
227
244
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubyperf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
4
|
+
prerelease: false
|
6
5
|
segments:
|
7
|
-
- 0
|
8
6
|
- 1
|
9
7
|
- 0
|
10
|
-
|
8
|
+
- 0
|
9
|
+
segments_generated: true
|
10
|
+
version: 1.0.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- lpasqualis
|
@@ -20,62 +20,58 @@ default_executable:
|
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
22
|
prerelease: false
|
23
|
-
name: shoulda
|
24
23
|
type: :development
|
24
|
+
name: shoulda
|
25
25
|
version_requirements: &id001 !ruby/object:Gem::Requirement
|
26
|
-
none: false
|
27
26
|
requirements:
|
28
27
|
- - ">="
|
29
28
|
- !ruby/object:Gem::Version
|
30
|
-
hash: 3
|
31
29
|
segments:
|
32
30
|
- 0
|
31
|
+
segments_generated: true
|
33
32
|
version: "0"
|
34
33
|
requirement: *id001
|
35
34
|
- !ruby/object:Gem::Dependency
|
36
35
|
prerelease: false
|
37
|
-
name: bundler
|
38
36
|
type: :development
|
37
|
+
name: bundler
|
39
38
|
version_requirements: &id002 !ruby/object:Gem::Requirement
|
40
|
-
none: false
|
41
39
|
requirements:
|
42
40
|
- - ~>
|
43
41
|
- !ruby/object:Gem::Version
|
44
|
-
hash: 23
|
45
42
|
segments:
|
46
43
|
- 1
|
47
44
|
- 0
|
48
45
|
- 0
|
46
|
+
segments_generated: true
|
49
47
|
version: 1.0.0
|
50
48
|
requirement: *id002
|
51
49
|
- !ruby/object:Gem::Dependency
|
52
50
|
prerelease: false
|
53
|
-
name: jeweler
|
54
51
|
type: :development
|
52
|
+
name: jeweler
|
55
53
|
version_requirements: &id003 !ruby/object:Gem::Requirement
|
56
|
-
none: false
|
57
54
|
requirements:
|
58
55
|
- - ~>
|
59
56
|
- !ruby/object:Gem::Version
|
60
|
-
hash: 7
|
61
57
|
segments:
|
62
58
|
- 1
|
63
59
|
- 6
|
64
60
|
- 4
|
61
|
+
segments_generated: true
|
65
62
|
version: 1.6.4
|
66
63
|
requirement: *id003
|
67
64
|
- !ruby/object:Gem::Dependency
|
68
65
|
prerelease: false
|
69
|
-
name: rcov
|
70
66
|
type: :development
|
67
|
+
name: rcov
|
71
68
|
version_requirements: &id004 !ruby/object:Gem::Requirement
|
72
|
-
none: false
|
73
69
|
requirements:
|
74
70
|
- - ">="
|
75
71
|
- !ruby/object:Gem::Version
|
76
|
-
hash: 3
|
77
72
|
segments:
|
78
73
|
- 0
|
74
|
+
segments_generated: true
|
79
75
|
version: "0"
|
80
76
|
requirement: *id004
|
81
77
|
description: Measures the performance of blocks of code, and provide reporting in various formats
|
@@ -95,10 +91,10 @@ files:
|
|
95
91
|
- README.rdoc
|
96
92
|
- Rakefile
|
97
93
|
- VERSION
|
94
|
+
- lib/perf/measure.rb
|
98
95
|
- lib/perf/meter.rb
|
99
96
|
- lib/perf/meter_factory.rb
|
100
97
|
- lib/perf/no_op_meter.rb
|
101
|
-
- lib/perf/noop_measure.rb
|
102
98
|
- lib/perf/report_format.rb
|
103
99
|
- lib/perf/report_format_html.rb
|
104
100
|
- lib/perf/report_format_simple.rb
|
@@ -107,6 +103,7 @@ files:
|
|
107
103
|
- test/helper.rb
|
108
104
|
- test/perf_test_example.rb
|
109
105
|
- test/rubyperf_test_helpers.rb
|
106
|
+
- test/test_meter_factory.rb
|
110
107
|
- test/test_perf_meter.rb
|
111
108
|
has_rdoc: true
|
112
109
|
homepage: http://github.com/lpasqualis/rubyperf
|
@@ -118,27 +115,25 @@ rdoc_options: []
|
|
118
115
|
require_paths:
|
119
116
|
- lib
|
120
117
|
required_ruby_version: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
118
|
requirements:
|
123
119
|
- - ">="
|
124
120
|
- !ruby/object:Gem::Version
|
125
|
-
hash: 3
|
126
121
|
segments:
|
127
122
|
- 0
|
123
|
+
segments_generated: true
|
128
124
|
version: "0"
|
129
125
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
130
|
-
none: false
|
131
126
|
requirements:
|
132
127
|
- - ">="
|
133
128
|
- !ruby/object:Gem::Version
|
134
|
-
hash: 3
|
135
129
|
segments:
|
136
130
|
- 0
|
131
|
+
segments_generated: true
|
137
132
|
version: "0"
|
138
133
|
requirements: []
|
139
134
|
|
140
135
|
rubyforge_project:
|
141
|
-
rubygems_version: 1.
|
136
|
+
rubygems_version: 1.3.6
|
142
137
|
signing_key:
|
143
138
|
specification_version: 3
|
144
139
|
summary: A gem to measure ruby code performance
|
data/lib/perf/noop_measure.rb
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Copyright (c) 2012 Lorenzo Pasqualis - DreamBox Learning, Inc
|
3
|
-
# https://github.com/lpasqualis/rubyperf
|
4
|
-
#
|
5
|
-
|
6
|
-
module Perf
|
7
|
-
#
|
8
|
-
# This class can be used in substitution to a Perf::Measure class to avoid overhead when performance measurments is not
|
9
|
-
# required. It needs to maintain the same API as Perf::Measure.
|
10
|
-
#
|
11
|
-
class NoopMeasure
|
12
|
-
|
13
|
-
def measurements
|
14
|
-
{}
|
15
|
-
end
|
16
|
-
|
17
|
-
def current_stack
|
18
|
-
{}
|
19
|
-
end
|
20
|
-
|
21
|
-
def initialize(logger = nil)
|
22
|
-
end
|
23
|
-
|
24
|
-
def clear
|
25
|
-
end
|
26
|
-
|
27
|
-
#############################################################################################################
|
28
|
-
|
29
|
-
def measure(what,type=nil)
|
30
|
-
yield
|
31
|
-
end
|
32
|
-
|
33
|
-
def count_value(what_to_count)
|
34
|
-
nil
|
35
|
-
end
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
end
|