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