nested-benchmark 0.8.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/HISTORY +7 -0
- data/README +72 -0
- data/Rakefile +42 -0
- data/lib/benchmark/nested.rb +5 -0
- data/lib/benchmark/nested/benchmark.rb +81 -0
- data/lib/benchmark/nested/tms_ext.rb +32 -0
- data/test/nested_benchmark_test.rb +44 -0
- data/test/test_helper.rb +3 -0
- metadata +59 -0
data/HISTORY
ADDED
data/README
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
= Nested Benchmark
|
2
|
+
|
3
|
+
== Author
|
4
|
+
|
5
|
+
Bruce Williams <bruce@codefluency.com>
|
6
|
+
http://codefluency.com
|
7
|
+
|
8
|
+
== Synopsis
|
9
|
+
|
10
|
+
The purpose of the nested-benchmark library is to add simple support for:
|
11
|
+
* Named, nested benchmarks that you don't have to keep track of to output later
|
12
|
+
* Blocks of code you want ignored by the benchmarks
|
13
|
+
|
14
|
+
== Usage
|
15
|
+
|
16
|
+
Requiring the library is intentionally similar to the Ruby Standard Library 'benchmark'
|
17
|
+
|
18
|
+
require 'benchmark/nested'
|
19
|
+
|
20
|
+
Note that it's 'benchmark/nested' and NOT 'nested/benchmark'
|
21
|
+
|
22
|
+
This adds two methods to Object; +benchmark+ and +ignore+. Here's an example of usage:
|
23
|
+
|
24
|
+
benchmark "Insert 30 records" do
|
25
|
+
ignore do
|
26
|
+
# Some database setup you don't want benchmarked
|
27
|
+
end
|
28
|
+
1.upto(30) do |number|
|
29
|
+
benchmark "Prepare record ##{number} for insertion" do
|
30
|
+
sleep rand(0.3)
|
31
|
+
# something that takes some time
|
32
|
+
end
|
33
|
+
sleep rand(0.1)
|
34
|
+
# insert into database
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
Afterwards, you can get the results by:
|
39
|
+
|
40
|
+
puts Benchmark::CAPTION # Just for some headers
|
41
|
+
NestedBenchmark.each do |benchmark|
|
42
|
+
# Note these are the toplevel benchmarks
|
43
|
+
puts benchmark
|
44
|
+
end
|
45
|
+
|
46
|
+
and get something like:
|
47
|
+
|
48
|
+
user system total real
|
49
|
+
0.010000 0.000000 0.010000 ( 25.789001) Insert 30 records
|
50
|
+
0.000000 0.000000 0.000000 ( 0.409687) > Prepare record #1 for insertion
|
51
|
+
0.000000 0.000000 0.000000 ( 0.332127) > Prepare record #2 for insertion
|
52
|
+
0.000000 0.000000 0.000000 ( 0.774727) > Prepare record #3 for insertion
|
53
|
+
0.000000 0.000000 0.000000 ( 0.522462) > Prepare record #4 for insertion
|
54
|
+
0.000000 0.000000 0.000000 ( 0.099711) > Prepare record #5 for insertion
|
55
|
+
|
56
|
+
You could also crawl the benchmarks manually if you want:
|
57
|
+
|
58
|
+
NestedBenchmark.each do |benchmark|
|
59
|
+
benchmark.each do |child|
|
60
|
+
child.each do |grandchild|
|
61
|
+
# ...
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
== Caveats
|
67
|
+
|
68
|
+
Don't put a +benchmark+ inside an +ignore+.
|
69
|
+
|
70
|
+
It doesn't really make any sense, and neither will the results.
|
71
|
+
|
72
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'rake/testtask'
|
2
|
+
require 'rubygems/specification'
|
3
|
+
require 'rake/gempackagetask'
|
4
|
+
require 'rake/rdoctask'
|
5
|
+
|
6
|
+
task :default => :test
|
7
|
+
|
8
|
+
Rake::TestTask.new do |t|
|
9
|
+
t.libs = %w(lib)
|
10
|
+
t.test_files = FileList["test/**/*.rb"]
|
11
|
+
end
|
12
|
+
|
13
|
+
Rake::RDocTask.new do |d|
|
14
|
+
d.main = "README"
|
15
|
+
d.rdoc_files.include("README", "HISTORY", "lib/**/*.rb")
|
16
|
+
end
|
17
|
+
|
18
|
+
PKG_VERSION = '0.8.0'
|
19
|
+
PKG_FILES = FileList['**/*'].exclude(/CVS|\.svn|pkg|coverage|Makefile|doc|rdoc|html/)
|
20
|
+
GEMSPEC = Gem::Specification.new do |s|
|
21
|
+
s.name = 'nested-benchmark'
|
22
|
+
s.version = PKG_VERSION
|
23
|
+
s.summary = "Support for nested bechmarking and ignored blocks"
|
24
|
+
s.description = "Add support for simple named benchmarking blocks, blocks to ignore during benchmarking, and output of benchmarks"
|
25
|
+
s.files = PKG_FILES
|
26
|
+
s.require_path = 'lib'
|
27
|
+
|
28
|
+
s.has_rdoc = true
|
29
|
+
s.rdoc_options <<
|
30
|
+
'--main' << 'NestedBenchmark' << '--line-numbers'
|
31
|
+
|
32
|
+
s.author = "Bruce Williams"
|
33
|
+
s.email = "bruce@codefluency.com"
|
34
|
+
s.homepage = "http://codefluency.rubyforge.org/nested-benchmark"
|
35
|
+
s.rubyforge_project = "codefluency"
|
36
|
+
end
|
37
|
+
|
38
|
+
Rake::GemPackageTask.new(GEMSPEC) do |pkg|
|
39
|
+
pkg.need_tar = true
|
40
|
+
pkg.package_files += PKG_FILES
|
41
|
+
end
|
42
|
+
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require File.dirname(__FILE__) << '/tms_ext'
|
2
|
+
|
3
|
+
module NestedBenchmark
|
4
|
+
|
5
|
+
class << self
|
6
|
+
|
7
|
+
include Enumerable
|
8
|
+
|
9
|
+
def each(&block)
|
10
|
+
benchmarks.each(&block)
|
11
|
+
end
|
12
|
+
|
13
|
+
def benchmarks
|
14
|
+
@benchmarks ||= []
|
15
|
+
end
|
16
|
+
|
17
|
+
def children_stack
|
18
|
+
@children_stack ||= []
|
19
|
+
end
|
20
|
+
|
21
|
+
def ignores
|
22
|
+
@ignores ||= []
|
23
|
+
end
|
24
|
+
|
25
|
+
def included(base)
|
26
|
+
base.__send__(:include, InstanceMethods)
|
27
|
+
end
|
28
|
+
|
29
|
+
def ignore_in_parent(offset)
|
30
|
+
NestedBenchmark.ignores.last << offset unless NestedBenchmark.ignores.empty?
|
31
|
+
end
|
32
|
+
|
33
|
+
def ignore
|
34
|
+
offset = sum(NestedBenchmark.ignores.pop)
|
35
|
+
ignore_in_parent offset
|
36
|
+
offset
|
37
|
+
end
|
38
|
+
|
39
|
+
def calculate(&block)
|
40
|
+
NestedBenchmark.ignores << []
|
41
|
+
yield - ignore
|
42
|
+
end
|
43
|
+
|
44
|
+
def reset!
|
45
|
+
benchmarks.clear
|
46
|
+
end
|
47
|
+
|
48
|
+
def sum(benchmarks)
|
49
|
+
benchmarks.inject(Benchmark::Tms.new) do |result, benchmark|
|
50
|
+
result + benchmark
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def add(benchmark)
|
55
|
+
if NestedBenchmark.children_stack.empty?
|
56
|
+
NestedBenchmark.benchmarks << benchmark
|
57
|
+
else
|
58
|
+
NestedBenchmark.children_stack.last << benchmark
|
59
|
+
end
|
60
|
+
benchmark
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
module InstanceMethods
|
66
|
+
|
67
|
+
def benchmark(name=nil, &block)
|
68
|
+
NestedBenchmark.children_stack << []
|
69
|
+
result = NestedBenchmark.calculate { Benchmark.measure(&block) }
|
70
|
+
result.label = name
|
71
|
+
result.children = NestedBenchmark.children_stack.pop
|
72
|
+
NestedBenchmark.add result
|
73
|
+
end
|
74
|
+
|
75
|
+
def ignore(&block)
|
76
|
+
NestedBenchmark.ignores.last << Benchmark.measure(&block)
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'benchmark'
|
2
|
+
|
3
|
+
module Benchmark
|
4
|
+
|
5
|
+
class Tms
|
6
|
+
|
7
|
+
include Enumerable
|
8
|
+
|
9
|
+
attr_accessor :label
|
10
|
+
attr_writer :children
|
11
|
+
def children
|
12
|
+
@children ||= []
|
13
|
+
end
|
14
|
+
|
15
|
+
def each(&block)
|
16
|
+
children.each(&block)
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_s(indent=0)
|
20
|
+
lines = []
|
21
|
+
lines << format(FMTSTR).rstrip
|
22
|
+
indenter = ('>' * indent) + ' ' if indent > 0
|
23
|
+
lines.last << " #{indenter}#{@label}"
|
24
|
+
children.each do |child|
|
25
|
+
lines << child.to_s(indent + 1)
|
26
|
+
end
|
27
|
+
lines.join("\n")
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'test/spec'
|
3
|
+
|
4
|
+
require File.dirname(__FILE__) << "/test_helper"
|
5
|
+
|
6
|
+
context "Nested Benchmark" do
|
7
|
+
|
8
|
+
specify "can use in arbitrary objects" do
|
9
|
+
assert_supports_benchmarking_in Object.new
|
10
|
+
assert_supports_benchmarking_in self
|
11
|
+
assert_supports_benchmarking_in Class.new
|
12
|
+
assert_supports_benchmarking_in Class.new.new
|
13
|
+
end
|
14
|
+
|
15
|
+
specify "benchmark returns a benchmark with children" do
|
16
|
+
b = benchmark { benchmark { } }
|
17
|
+
assert_kind_of Benchmark::Tms, b
|
18
|
+
assert_kind_of Array, b.children
|
19
|
+
assert_respond_to b, :each
|
20
|
+
b.each do |c|
|
21
|
+
assert_kind_of Benchmark::Tms, c
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
specify "can reset toplevel benchmarks" do
|
26
|
+
benchmark { benchmark { } }
|
27
|
+
assert 1, benchmarks.size
|
28
|
+
NestedBenchmark.reset!
|
29
|
+
assert 0, benchmarks.size
|
30
|
+
end
|
31
|
+
|
32
|
+
#######
|
33
|
+
private
|
34
|
+
#######
|
35
|
+
|
36
|
+
def benchmarks
|
37
|
+
NestedBenchmark.benchmarks
|
38
|
+
end
|
39
|
+
|
40
|
+
def assert_supports_benchmarking_in(object)
|
41
|
+
%w(benchmark ignore).all? { |m| object.respond_to?(m) }
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.9.4
|
3
|
+
specification_version: 1
|
4
|
+
name: nested-benchmark
|
5
|
+
version: !ruby/object:Gem::Version
|
6
|
+
version: 0.8.0
|
7
|
+
date: 2007-12-04 00:00:00 -06:00
|
8
|
+
summary: Support for nested bechmarking and ignored blocks
|
9
|
+
require_paths:
|
10
|
+
- lib
|
11
|
+
email: bruce@codefluency.com
|
12
|
+
homepage: http://codefluency.rubyforge.org/nested-benchmark
|
13
|
+
rubyforge_project: codefluency
|
14
|
+
description: Add support for simple named benchmarking blocks, blocks to ignore during benchmarking, and output of benchmarks
|
15
|
+
autorequire:
|
16
|
+
default_executable:
|
17
|
+
bindir: bin
|
18
|
+
has_rdoc: true
|
19
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.0.0
|
24
|
+
version:
|
25
|
+
platform: ruby
|
26
|
+
signing_key:
|
27
|
+
cert_chain:
|
28
|
+
post_install_message:
|
29
|
+
authors:
|
30
|
+
- Bruce Williams
|
31
|
+
files:
|
32
|
+
- HISTORY
|
33
|
+
- lib
|
34
|
+
- lib/benchmark
|
35
|
+
- lib/benchmark/nested
|
36
|
+
- lib/benchmark/nested/benchmark.rb
|
37
|
+
- lib/benchmark/nested/tms_ext.rb
|
38
|
+
- lib/benchmark/nested.rb
|
39
|
+
- Rakefile
|
40
|
+
- README
|
41
|
+
- test
|
42
|
+
- test/nested_benchmark_test.rb
|
43
|
+
- test/test_helper.rb
|
44
|
+
test_files: []
|
45
|
+
|
46
|
+
rdoc_options:
|
47
|
+
- --main
|
48
|
+
- NestedBenchmark
|
49
|
+
- --line-numbers
|
50
|
+
extra_rdoc_files: []
|
51
|
+
|
52
|
+
executables: []
|
53
|
+
|
54
|
+
extensions: []
|
55
|
+
|
56
|
+
requirements: []
|
57
|
+
|
58
|
+
dependencies: []
|
59
|
+
|